为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 to_json 和 from_json 消除 pyspark 数据帧中的嵌套结构字段?

如何使用 to_json 和 from_json 消除 pyspark 数据帧中的嵌套结构字段?

Helenr 2022-06-14 14:50:31
从理论上讲,这个解决方案非常适合我的需要,即创建数据帧的新复制版本,同时排除某些嵌套的结构字段。这是我的问题的最低限度可重现的工件:>>> df.printSchema()root| -- big: array(nullable=true)| | -- element: struct(containsNull=true)| | | -- keep: string(nullable=true)| | | -- delete: string(nullable=true)您可以像这样实例化它:schema = StructType([StructField("big", ArrayType(StructType([    StructField("keep", StringType()),    StructField("delete", StringType())])))])df = spark.createDataFrame(spark.sparkContext.emptyRDD(), schema)我的目标是将数据框(以及我要保留的列中的值)转换为排除某些嵌套结构的数据框,delete例如。root| -- big: array(nullable=true)| | -- element: struct(containsNull=true)| | | -- keep: string(nullable=true)根据我链接的尝试利用 pyspark.sqlto_json和from_json函数的解决方案,它应该可以通过以下方式完成:new_schema = StructType([StructField("big", ArrayType(StructType([             StructField("keep", StringType())])))])test_df = df.withColumn("big", to_json(col("big"))).withColumn("big", from_json(col("big"), new_schema))>>> test_df.printSchema()root| -- big: struct(nullable=true)| | -- big: array(nullable=true)| | | -- element: struct(containsNull=true)| | | | -- keep: string(nullable=true)>>> test_df.show()+----+| big|+----+|null|+----+所以要么我没有正确地遵循他的指示,要么它不起作用。没有 udf 怎么办?
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

它应该可以工作,您只需要调整 new_schema 以仅包含“大”列的元数据,而不是数据框:


new_schema = ArrayType(StructType([StructField("keep", StringType())]))


test_df = df.withColumn("big", from_json(to_json("big"), new_schema))


查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信