从理论上讲,这个解决方案非常适合我的需要,即创建数据帧的新复制版本,同时排除某些嵌套的结构字段。这是我的问题的最低限度可重现的工件:
>>> 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 怎么办?
慕森王
相关分类