Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spark Scala将结构化数据转换为JSON格式_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

使用Spark Scala将结构化数据转换为JSON格式

使用Spark Scala将结构化数据转换为JSON格式,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我的结构化数据如下所示,我需要将其转换为下图所示的预期结果类型。我的输出模式也显示出来。如果您能提供一些帮助,帮助我如何使用Spark Scala代码实现这一点,我将不胜感激 注:根据要进行的结构化数据对SN列和VIN列进行分组。 对于相同的序列号和VIN,应该有一行,如果序列号或VIN发生变化,则数据将显示在下一行中 结构化数据: +-----------------+-------------+--------------------+---+ |VIN |ST

我的结构化数据如下所示,我需要将其转换为下图所示的预期结果类型。我的输出模式也显示出来。如果您能提供一些帮助,帮助我如何使用Spark Scala代码实现这一点,我将不胜感激

注:根据要进行的结构化数据对SN列和VIN列进行分组。 对于相同的序列号和VIN,应该有一行,如果序列号或VIN发生变化,则数据将显示在下一行中

结构化数据:

+-----------------+-------------+--------------------+---+
|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"}]|
+----------------+---------------------------------------------------------------------------------------------+