使用 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))))
你应该关注 dataframe
和 schema
+--------------------------------------------------------------------------------------------------+
|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 文件和解析,进入获取数据帧的第一阶段。
我正在使用飞艇笔记本并尝试使用 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))))
你应该关注 dataframe
和 schema
+--------------------------------------------------------------------------------------------------+
|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 文件和解析,进入获取数据帧的第一阶段。