我是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这样的值。 现在我的问题是:
我想做两件事:
我想将我的例如平均值添加到第一个结构“dialogeData”
我想将整个列添加到数组“snippetlist”作为新的结构“情绪”,以便对于数组中的每个片段显示正确的情绪。
这可能吗?我真的没有找到关于这个案子的任何好事,所以我真的希望有人可以帮助我。
非常感谢!
答案 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。