我试图在pysparkDataframe中分解一个json列。
这与pyspark dataframe with json column的问题类似,将json元素聚合到一个新列中并删除重复的元素
但是这个新的json列有更复杂的结构。
Dataframe
year month id json_col
2010 08 5 {"my_p": [{"like": false, "p_id": "dfvefvsd"}, {"like": true, "p_id": "dvcdc"}], "p_id": "cdscas"}
我需要一个新的颜色:
year month id like p_id
2010 8 5 false dfvefvsd
2010 8 5 true dvcdc
2010 8 5 null cdscas
如果在同一年、月、id中存在重复的p\ U id,请将其删除。
从上面链接中学习的代码(归功于@shu)
from pyspark.sql import functions as F
from pyspark.sql.types import *
t = spark.sql('select * from my_db.my_tab')
schema = ArrayType(
StructType(
[
StructField('my_p',
StructType(
[StructField('p_id', StringType(), True),
StructField('like', BooleanType(), True)
]
),
True),
StructField('p_id', StringType(), True)
]
)
)
t1 = t.withColumn('a_col', F.from_json('json_col', schema)).select('year', 'month', 'id', 'p_id', F.expr('transform(json_col, f -> f.p_id)').alias('tmp'))
t1.groupBy("year","month", 'id', 'p_id').agg(F.to_json(F.array_distinct(F.flatten(F.collect_list(F.col("tmp"))))).alias("new_col")).show(10,False)
但是,只有第一个“p\u id”是从json\u列分解出来的。
谢谢
1条答案
按热度按时间rkttyhzu1#
试试这个