我有一个数据帧df
如下:
+---+--------+----+
| Id| Size| Amt|
+---+--------+----+
| a1| 1|55.0|
| a2| 2|48.0|
| a3| 3|28.0|
+---+--------+----+
此数据帧的架构为:
StructType([
StructField("Id", StringType(), True),
StructField("Size", IntegerType(), True),
StructField("Amt", FloatType(), True)
])
当我使用 df.write.json("my_output_path")
时,json 文件看起来像:
{"Id":"a1", "Size":1, "Amt":55.0}
{"Id":"a2", "Size":2, "Amt":48.0}
{"Id":"a3", "Size":3, "Amt":28.0}
使用 df
,我想创建df1
,使其具有一个新的数组列(Arr
(,其中包含现有列的键值对。
df1.write.json("my_new_output_path")
的输出文件应如下所示:
{"Id":"a1", "Size":1, "Amt":55.0, "Arr":[{"Id":"a1","Size":1,"Amt":55.0 }] }
{"Id":"a2", "Size":2, "Amt":48.0, "Arr":[{"Id":"a2","Size":2,"Amt":48.0 }] }
{"Id":"a3", "Size":3, "Amt":28.0, "Arr":[{"Id":"a3","Size":3,"Amt":28.0 }] }
我尝试了以下内容,但它给了我不同的输出:
df1 = df.select('Id', 'Size', 'Amt', array('Id','Size','Amt').alias("Arr"))
df1.write.json("my_new_output_path")
电流输出:
{"Id":"a1", "Size":1, "Amt":55.0, "Arr":["a1", 1 ,55.0] }
{"Id":"a2", "Size":2, "Amt":48.0, "Arr":["a2", 2 ,48.0] }
{"Id":"a3", "Size":3, "Amt":28.0, "Arr":["a3", 3 ,28.0] }
如何获得预期的输出?任何解决方案或指示将不胜感激。
由于你想要键值对,字典会更合适,而不是使用array
尝试create_map
(在 Scala 中map
(。此函数采用分组为键值对(键 1、值 1、键 2、值 2、...(的列列表。
df1 = df.select('Id', 'Size', 'Amt', create_map(lit('Id'), 'Id', lit('Size'), 'Size', lit('Amt'), 'Amt').alias("Arr"))
此处使用lit
创建具有文本字符串值的列。
然后像以前一样保存新数据帧,生成的 json 将如下所示:
{"Id":"a1","Size":1,"Amt":55.0,"Arr":{"Id":"a1","Size":"1","Amt":"55.0"}}
{"Id":"a2","Size":2,"Amt":48.0,"Arr":{"Id":"a2","Size":"2","Amt":"48.0"}}
{"Id":"a3","Size":3,"Amt":28.0,"Arr":{"Id":"a3","Size":"3","Amt":"28.0"}}