如何处理Spark中的架构更改?

时间:2019-07-15 18:26:34

标签: python apache-spark pyspark

请考虑以下情形:
每天都会将增量数据摄取到HDFS位置,然后我必须从那里使用pyspark读取数据并找出最新/活动记录。 另外,由于可能会添加新字段,因此我必须处理数据中的架构更改。

如何在pyspark中实现模式比较并处理模式更改?
如何处理架构更改之前已加载的数据?

以下方法是一种好方法吗?

  1. 生成脚本以在HDFS位置顶部创建配置单元表。
  2. 然后使用pyspark比较源表和Hive表的架构。如果发生模式更改,请使用源中的新模式来创建用于表创建的新ddl。删除现有表并使用新架构创建表。
  3. 从配置单元表创建视图以使用主键和审计列获取最新记录。

1 个答案:

答案 0 :(得分:0)

以下是一些针对您的案例的建议,假设您需要将旧数据与新摄取的数据合并,然后将其保存回HDFS:

  1. 使用StructType.fromDDL(prev_schema)将旧数据与DDL或字符串格式的已保存架构一起加载到数据帧/数据集中。 Here,您可以找到相关的讨论。
  2. 当新数据到达时,像以前一样将其加载到数据帧中。然后通过遍历hereStructType对象的子项来比较这两种模式。
  3. 最后根据它们之间的差异来决定使用最新还是最新的模式。

如果,另一方面,您需要存储历史数据,那么我会选择一种支持架构演进的存储格式,例如Parquet或AVRO,第一种更适合您的情况,因为它可以提供更好的性能。