如何用字符串类型的现有pyspark数据帧定义嵌套属性的Schema,然后用json打印



我有一个数据帧,列model_code为字符串类型,我必须将列转换为model.code,当我打印df.toJSON()时,它是{"model.code":"xyz"},但我需要打印类似于-{"model":{"code":"xyz"}}的json。如何使用pyspark或panda来实现这一点?

示例数据帧:

model.code model.name
700 桌面
250 片剂
一种方法是使用toJSON(),然后在输出RDD上使用map来操作JSON字符串。
df = spark.createDataFrame(data=[(700, 'Desktop'), (250, 'Tablet')], schema = ['model.code', 'model.name'])
>>> df.show()
+----------+----------+
|model.code|model.name|
+----------+----------+
|       700|   Desktop|
|       250|    Tablet|
+----------+----------+
>>> import json
>>> df.toJSON() 
...   .map(lambda x: json.loads('{"model":'+x.replace('model.','')+'}')) 
...   .collect()
[{'model': {'code': 700, 'name': 'Desktop'}}, {'model': {'code': 250, 'name': 'Tablet'}}]

您需要构造嵌套的struct,然后使用to_json函数转换为json字符串。

df = df.select(F.collect_list(F.to_json(
F.struct(F.struct(F.col('`model.code`').alias('code'), F.col('`model.name`').alias('name')).alias('model'))))
)
df.show(truncate=False)

最新更新