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

从理论上讲,这个解决方案非常适合我的需要,即创建数据帧的新复制版本,同时排除某些嵌套的结构字段。这是我的问题的最低限度可重现的工件:


>>> 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 怎么办?


Helenr
浏览 155回答 1
1回答

慕森王

它应该可以工作,您只需要调整 new_schema 以仅包含“大”列的元数据,而不是数据框:new_schema = ArrayType(StructType([StructField("keep", StringType())]))test_df = df.withColumn("big", from_json(to_json("big"), new_schema))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python