此问题与https://stackoverflow.com/a/37090151/1661491相关。假设我有一个具有特定模式的pyspark DataFrame,我想用我知道兼容的新模式覆盖该模式,我可以这样做:
df: DataFrame
new_schema = ...
df.rdd.toDF(schema=new_schema)
不幸的是,这会触发上述链接中描述的计算。有没有一种方法可以在元数据级别(或懒惰)做到这一点,而不急于触发计算或转换?
编辑,请注意:
- 模式可以任意复杂(嵌套等)
- 新架构包括对描述、可为空性和附加元数据的更新(更新类型可获得加分)
- 我想避免编写自定义查询表达式生成器,除非Spark中已经内置了一个可以基于架构/
StructType
生成查询的生成器
2条答案
按热度按时间piv4azn71#
最后,我自己也深入探讨了这个问题,我很好奇您对我的变通方法/POC的看法。参见https://github.com/ravwojdyla/spark-schema-utils。它转换表达式,并更新属性。
假设我有两个模式,第一个没有任何元数据,让我们调用
schema_wo_metadata
:第二个在内部(
ia
)字段和外部(ob
)字段上具有额外的元数据,我们将其命名为schema_wi_metadata
现在假设我有一个具有
schema_wo_metadata
架构的数据集,并且希望将该架构与schema_wi_metadata
交换:现在,
new_df
具有schema_wi_metadata
,例如:有什么意见吗?
hfsqlsce2#
仅供快速更新,此功能已通过https://github.com/apache/spark/pull/37011添加到Spark中,并将在版本3.4.0中发布。