pyspark将新的嵌套数组添加到现有的json文件中

时间:2017-07-20 12:34:25

标签: json hadoop apache-spark dataframe pyspark

我是Spark的新手并且有一个很大的问题,即使经过几个小时的搜索,我也无法处理... 我有一个jsonFile,看起来像这样:

root
 |-- dialogueData: struct (nullable = true)
 |    |-- dialogueID: string (nullable = true)
 |    |-- dialogueLength: double (nullable = true)
 |    |-- speakerChanges: long (nullable = true)
 |-- snippetlist: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- confidence: double (nullable = true)
 |    |    |-- length: double (nullable = true)
 |    |    |-- role: string (nullable = true)
 |    |    |-- snippetID: string (nullable = true)
 |    |    |-- transcription: string (nullable = true)
 |    |    |-- wordCount: long (nullable = true)

我的程序执行情绪分析并返回带有预测(1.0,0.0,-1.0等)的数据框列,并返回一些像average这样的值。 现在我的问题是:

我想做两件事:

  1. 我想将我的例如平均值添加到第一个结构“dialogeData”

  2. 我想将整个列添加到数组“snippetlist”作为新的结构“情绪”,以便对于数组中的每个片段显示正确的情绪。

  3. 这可能吗?我真的没有找到关于这个案子的任何好事,所以我真的希望有人可以帮助我。

    非常感谢!

1 个答案:

答案 0 :(得分:0)

首先,在添加任何其他方法之前,您需要进行连接,以便您要添加的元素位于添加到原始数据框的新列中。 在任何情况下,一旦你拥有相关的数据帧,你可以将它写入json

要创建相关数据框,您有以下几种选择:

第一个选项(如果你知道scala最简单)是使用scala,在这种情况下你可以通过创建一个表示原始值和目标值的case类并相应地转换(不是很漂亮)来使用数据集API。

第二个选项是转换为RDD并使用map添加相关数据。这可能是相当丑陋和低效的。

第三个选项是使用to_json将整个记录转换为json string然后你可以编写一个UDF,它将字符串转换为目标的json(接收额外的输入,将json转换为字典,更新字典并转换回来)到json)。然后可以使用from_json函数将结果字符串转换回数据帧信息。

第四个选项是使用数据框选项。我们的想法是你可以使用select(" structName。*")来展平结构,然后你可以使用struct(col1,col2,...)重新创建它。

要向数组添加元素,首先需要使用posexplode(这将从数组中的每个元素创建一行,其中一个列为位置,一个为值),然后将其展平,然后添加元素(通过使用getItem函数获取相关位置)并转换回struct和collect_list。