如何将以下代码转换为使用df2.write.format('json')
rdd.map
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,但是由于我是新手,所以我不确定如何将输入的内容转换为输出所需的嵌套方案。
答案 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")