在pyspark中,如何使用其他方案将rdd转换为json?

时间:2018-12-04 11:18:35

标签: apache-spark pyspark

如何将以下代码转换为使用df2.write.format('json')

使用pyspark DataFrame写入输出json
  1. 我有一个输入列表(例如,只有几项)。
  2. 想编写一个比输入更复杂/嵌套的json。
  3. 我尝试使用rdd.map
  4. 问题:输出包含json中每个对象的撇号。
  5. 我不能仅仅替换字符串,因为数据本身可能包含它。
  6. 在下面的示例中,如果有更好的方法可以使用DataFrame将方案转换为嵌套json,可以显示如何?因为这样可以一起解决撇号。

这是我尝试过的:

import json 

rdd = sc.parallelize([(1,2,3),(4,5,6),(7,8,9)])
df = rdd.toDF(["a","b","c"])
rddToJson = df.rdd.map(lambda x: json.dumps({"some_top_level_1": {"mycolumn1": x.a}})) // note that result json is complex and more nested than input
rddToJson.collect()

结果:包含撇号(无法替换,它可以出现在值中的任何位置)如何使用适当的方案和数据帧然后执行df.json.write?

结果:

Out[20]: 
['{"some_top_level_1": {"mycolumn1": 1}}',
 '{"some_top_level_1": {"mycolumn1": 4}}',
 '{"some_top_level_1": {"mycolumn1": 7}}']

我的目标(除非可以通过其他方式完成)是使用df.write.format('json')以便从上述输入中写入嵌套/复杂的json。

PS:我看到了一条有趣的帖子:https://medium.com/@mrpowers/adding-structtype-columns-to-spark-dataframes-b44125409803,但是由于我是新手,所以我不确定如何将输入的内容转换为输出所需的嵌套方案。

1 个答案:

答案 0 :(得分:2)

您可以使用struct函数从平面模式创建嵌套数据框。

import json 

rdd = sc.parallelize([(1,2,3),(4,5,6),(7,8,9)])
df = rdd.toDF(["a","b","c"])

df2 = df.withColumn("some_top_level_1", struct(col("a").alias("my_column1"))).select("some_top_level_1")
df2.coalesce(1).write.mode("overwrite").json("test.json")