使用Spark Scala将结构化数据转换为JSON格式
我的结构化数据如下所示,我需要将其转换为下图所示的预期结果类型。我的输出模式也显示出来。如果您能提供一些帮助,帮助我如何使用Spark Scala代码实现这一点,我将不胜感激 注:根据要进行的结构化数据对SN列和VIN列进行分组。 对于相同的序列号和VIN,应该有一行,如果序列号或VIN发生变化,则数据将显示在下一行中 结构化数据:使用Spark Scala将结构化数据转换为JSON格式,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我的结构化数据如下所示,我需要将其转换为下图所示的预期结果类型。我的输出模式也显示出来。如果您能提供一些帮助,帮助我如何使用Spark Scala代码实现这一点,我将不胜感激 注:根据要进行的结构化数据对SN列和VIN列进行分组。 对于相同的序列号和VIN,应该有一行,如果序列号或VIN发生变化,则数据将显示在下一行中 结构化数据: +-----------------+-------------+--------------------+---+ |VIN |ST
+-----------------+-------------+--------------------+---+
|VIN |ST |SV |SN |
|FU74HZ501740XXXXX|1566799999225|44.0 |APP|
|FU74HZ501740XXXXX|1566800002758|61.0 |APP|
|FU74HZ501740XXXXX|1566800009446|23.39 |ASP|
预期成果:
输出架构:
val outputSchema = StructType(
List(
StructField("VIN", StringType, true),
StructField("EVENTS", ArrayType(
StructType(Array(
StructField("SN", StringType, true),
StructField("ST", IntegerType, true),
StructField("SV", DoubleType, true)
))))
)
)
你可以通过SparkSession获得它 val df=spark.read.json/path/to/json/file/test.json
这里spark是SparkSession对象您可以通过SparkSession获得它 val df=spark.read.json/path/to/json/file/test.json
这里spark是spark 2.1中的SparkSession对象,您可以使用struct和collect_list实现这一点 将收集列表与结构一起使用: 这将提供所需的输出:
+----------------+---------------------------------------------------------------------------------------------+
|vin |events |
+----------------+---------------------------------------------------------------------------------------------+
|FU74HZ501740XXXX|[{"st":1.566800009446E12,"sv":23.39,"sn":"ASP"}] |
|FU74HZ501740XXXX|[{"st":1.566799999225E12,"sv":44.0,"sn":"APP"},{"st":1.566800002758E12,"sv":61.0,"sn":"APP"}]|
+----------------+---------------------------------------------------------------------------------------------+
在Spark 2.1中,您可以使用struct和collect_list实现这一点 将收集列表与结构一起使用: 这将提供所需的输出:
+----------------+---------------------------------------------------------------------------------------------+
|vin |events |
+----------------+---------------------------------------------------------------------------------------------+
|FU74HZ501740XXXX|[{"st":1.566800009446E12,"sv":23.39,"sn":"ASP"}] |
|FU74HZ501740XXXX|[{"st":1.566799999225E12,"sv":44.0,"sn":"APP"},{"st":1.566800002758E12,"sv":61.0,"sn":"APP"}]|
+----------------+---------------------------------------------------------------------------------------------+
请在问题中添加文本而不是图像。它使我们更容易根据您当前的数据集重现问题。您在此处按哪列分组?SN?您好@Shaido,是的,应该对SN列进行分组。。。我想循环浏览SN列,并将SN、ST、SV包含在单个列事件数组中,将VIN作为另一列,如预期结果所示。@AnilKumarKB:如果SN对同一VIN具有不同的VALEU,会发生什么?例如,在您的示例中,如果第二行的VIN与第一行不同。Hello@Shaido很抱歉混淆,它应该按SN和VIN分组。例如:同一序列号和VIN对应一行。如果SN或VIN发生变化,则数据将显示在下一行中。请在问题中添加文本而不是图像。它使我们更容易根据您当前的数据集重现问题。您在此处按哪列分组?SN?您好@Shaido,是的,应该对SN列进行分组。。。我想循环浏览SN列,并将SN、ST、SV包含在单个列事件数组中,将VIN作为另一列,如预期结果所示。@AnilKumarKB:如果SN对同一VIN具有不同的VALEU,会发生什么?例如,在您的示例中,如果第二行的VIN与第一行不同。Hello@Shaido很抱歉混淆,它应该按SN和VIN分组。例如:同一序列号和VIN对应一行。如果SN或VIN发生变化,则数据将显示在下一行中。请注意,问题不在于读取json文件,而是将数据帧转换为包含json元素的数组列。我了解可以转换为json的结构化数据,而不是将其视为数据帧。我的错。请注意,问题不是读取json文件,而是将数据帧转换为包含json元素的数组列。我了解可以转换为json的结构化数据,而不是将其视为数据帧。我的坏朋友。您可以在agg collect_listto_jsonstruct中使用to_json。。。以避免出现额外的withColumn。这在较早的Spark版本中也应该是可能的,可能是从引入to_json的版本2.1开始的。@AnilKumarKB great+1。您可以在agg collect_listto_jsonstruct中使用to_json。。。以避免出现额外的withColumn。这在旧的Spark版本中也应该是可能的,可能是从引入to_json的版本2.1开始的。@AnilKumarKB很棒
+----------------+---------------------------------------------------------------------------------------------+
|vin |events |
+----------------+---------------------------------------------------------------------------------------------+
|FU74HZ501740XXXX|[{"st":1.566800009446E12,"sv":23.39,"sn":"ASP"}] |
|FU74HZ501740XXXX|[{"st":1.566799999225E12,"sv":44.0,"sn":"APP"},{"st":1.566800002758E12,"sv":61.0,"sn":"APP"}]|
+----------------+---------------------------------------------------------------------------------------------+