使用 spark sql 将 Json WrappedArray 转换为字符串

Convert Json WrappedArray to String using spark sql

我正在使用飞艇笔记本并尝试使用 sql 从 table 加载数据。 在 table 中,每一行都有一列,这是一个 JSON blob。例如,[{'timestamp':12345,'value':10},{'timestamp':12346,'value':11},{'timestamp':12347,'value':12}]

我想 select JSON blob 作为字符串,就像原始字符串一样。但是 spark 会自动将其加载为 WrappedArray。

看来我必须写一个UDF来将WrappedArray转换为字符串。以下是我的代码。

我先定义一个Scala函数,然后注册函数。然后在列上使用注册的函数。

val unwraparr = udf ((x: WrappedArray[(Int, Int)]) => x.map { case Row(val1: String) =>  + "," + val2 })
sqlContext.udf.register("fwa", unwraparr)

没用。如果有人能提供帮助,我将不胜感激。

以下是我正在处理的部分的架构。会有很多数量和时间戳对。

-- targetColumn: array (nullable = true)
    |-- element: struct (containsNull = true)
    |    |-- value: long (nullable = true)
    |    |-- timeStamp: string (nullable = true)

更新: 我想出了以下代码:

val f = (x: Seq[Row]) => x.map { case Row(val1: Long, val2: String) => x.mkString("+") }

我需要它将 objects/struct/row(不确定如何调用结构)连接到单个字符串。

如果您在 spark 中作为 dataframe/dataset 加载的数据如下,并且 schema 作为

+------------------------------------+
|targetColumn                        |
+------------------------------------+
|[[12345,10], [12346,11], [12347,12]]|
|[[12345,10], [12346,11], [12347,12]]|
+------------------------------------+

root
 |-- targetColumn: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- timeStamp: string (nullable = true)
 |    |    |-- value: long (nullable = true)

然后您可以将 dataframe 作为 json 写入临时 json 文件并将其作为文本文件读取并解析 String line 并将其转换为 dataframe 如下(/home/testing/test.json 是临时 json 文件位置)

df.write.mode(SaveMode.Overwrite).json("/home/testing/test.json")

val data = sc.textFile("/home/testing/test.json")

val rowRdd = data.map(jsonLine => Row(jsonLine.split(":\[")(1).replace("]}", "")))
val stringDF = sqlContext.createDataFrame(rowRdd, StructType(Array(StructField("targetColumn", StringType, true))))

你应该关注 dataframeschema

+--------------------------------------------------------------------------------------------------+
|targetColumn                                                                                      |
+--------------------------------------------------------------------------------------------------+
|{"timeStamp":"12345","value":10},{"timeStamp":"12346","value":11},{"timeStamp":"12347","value":12}|
|{"timeStamp":"12345","value":10},{"timeStamp":"12346","value":11},{"timeStamp":"12347","value":12}|
+--------------------------------------------------------------------------------------------------+

root
 |-- targetColumn: string (nullable = true)

希望回答对你有帮助

最初读取为文本而不是数据帧

您可以使用我的第二阶段答案,即读取 json 文件和解析,进入获取数据帧的第一阶段。