Scala 使用spark sql将Json WrappedArray转换为字符串
我正在制作齐柏林飞艇笔记本,并尝试使用sql从表中加载数据。 在表中,每行有一列,这是一个JSON blob。例如,Scala 使用spark sql将Json WrappedArray转换为字符串,scala,apache-spark,apache-zeppelin,Scala,Apache Spark,Apache Zeppelin,我正在制作齐柏林飞艇笔记本,并尝试使用sql从表中加载数据。 在表中,每行有一列,这是一个JSON blob。例如,[{'timestamp':12345,'value':10},{'timestamp':12346,'value':11},{'timestamp':12347,'value':12}] 我想选择JSON blob作为字符串,就像原始字符串一样。但spark会自动将其作为WrappedArray加载 似乎我必须编写一个UDF来将WrappedArray转换为字符串。下面是我的代码
[{'timestamp':12345,'value':10},{'timestamp':12346,'value':11},{'timestamp':12347,'value':12}]
我想选择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(不确定如何调用struct)连接到单个字符串 如果您在
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文件,并将其作为文本文件读取,然后解析字符串行
,并将其转换为dataframe
,如下所示(/home/testing/test.json
是临时json
文件位置)
这将为您留下以下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文件读取和解析,进入获取数据帧的第一阶段。您可以使用
数据帧的模式
进行更新吗?只要复制粘贴dataframe.printSchema()
@RameshMaharjan的输出,它就被更新了。谢谢请更新所需的输出。@Ankussingh设计的输出是:{'timestamp':12345,'value':10},{'timestamp':12346,'value':11},{'timestamp':12347,'value':12}。现在,zipplin中显示的列是WrappedArray([1012345]、[1112346]、[1212347])。该列将自动解析,但我需要原始json字符串。@Ryan请查看下面我的更新答案。:)
+--------------------------------------------------------------------------------------------------+
|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)