从理论上讲,这个解决方案非常适合我的需要,即创建数据帧的新复制版本,同时排除某些嵌套的结构字段。这是我的问题的最低限度可重现的工件:>>> 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))
添加回答
举报
0/150
提交
取消