【发布时间】:2017-08-05 10:27:18
【问题描述】:
我在 Spark 中有一个嵌套的 JSON 数据框,如下所示
root
|-- data: struct (nullable = true)
| |-- average: long (nullable = true)
| |-- sum: long (nullable = true)
| |-- time: string (nullable = true)
|-- password: string (nullable = true)
|-- url: string (nullable = true)
|-- username: string (nullable = true)
我需要将数据结构下的时间变量转换为时间戳数据类型。以下是我尝试过的代码,但没有给我想要的结果。
val jsonStr = """{
"url": "imap.yahoo.com",
"username": "myusername",
"password": "mypassword",
"data": {
"time":"2017-1-29 0-54-32",
"average": 234,
"sum": 123}}"""
val json: JsValue = Json.parse(jsonStr)
import sqlContext.implicits._
val rdd = sc.parallelize(jsonStr::Nil);
var df = sqlContext.read.json(rdd);
df.printSchema()
val dfRes = df.withColumn("data",makeTimeStamp(unix_timestamp(df("data.time"),"yyyy-MM-dd hh-mm-ss").cast("timestamp")))
dfRes.printSchema();
case class Convert(time: java.sql.Timestamp)
val makeTimeStamp = udf((time: java.sql.Timestamp) => Convert(
time))
我的代码结果:
root
|-- data: struct (nullable = true)
| |-- time: timestamp (nullable = true)
|-- password: string (nullable = true)
|-- url: string (nullable = true)
|-- username: string (nullable = true)
我的代码实际上是删除数据结构中的其他元素(平均值和总和),而不是仅仅将时间字符串转换为时间戳数据类型。对于 JSON 数据帧上的基本数据管理操作,我们是否需要在需要功能时编写 UDF,或者是否有可用于 JSON 数据管理的库。我目前正在使用 Play 框架来处理 Spark 中的 JSON 对象。提前致谢。
【问题讨论】:
标签: json scala apache-spark