我阅读了以下博客,发现 API 非常有用。
在博客中,有很多数据选择示例。就像使用输入
{
"a": {
"b": 1
}
}
应用Scala: events.select("a.b")
,输出将是
{
"b": 1
}
但是博客中没有提到数据类型转换。说我有以下输入:
{
"timestampInSec": "1514917353",
"ip": "123.39.76.112",
"money": "USD256",
"countInString": "6"
}
预期的输出是:
{
"timestamp": "2018-01-02 11:22:33",
"ip_long": 2066173040,
"currency": "USD",
"money_amount": 256,
"count": 6
}
有一些转换未包含在org.apache.spark.sql.functions._
:
- 时间戳在秒,是字符串类型
- 将IP转换为长
- 拆分
USD256
为两列并将其中一列转换为数字 - 将字符串转换为数字
另一件事是错误处理和默认值。如果输入无效,例如:
{
"timestampInSec": "N/A",
"money": "999",
"countInString": "Number-Six"
}
预计输出可以是
{
"timestamp": "1970-01-01 00:00:00",
"ip_long": 0,
"currency": "NA",
"money_amount": 999,
"count": -1
}
- 输入
timestampInSec
不是数字。预计使用 0 并创建一个时间戳字符串作为返回值 ip
输入中缺少。预计使用默认值 0。money
字段不完整。它有金额但错过了货币。预计将NA
用作默认货币并正确翻译money_amount
countInString
不是一个数字。预计使用-1
( not 0 ) 作为默认值。
这些需求并不常见,需要一些自定义的业务逻辑代码。
我确实检查了一些功能,例如to_timestamp
. 有一些代码生成的东西,似乎不太容易添加新功能。是否有一些关于编写自定义转换函数的指南/文档?有没有简单的方法来满足要求?