为什么添加到拼花地板表的新列不能从glue pyspark ETL作业中获得?

为什么添加到拼花地板表的新列不能从glue pyspark ETL作业中获得?,pyspark,parquet,aws-glue,Pyspark,Parquet,Aws Glue,我们一直在探索使用Glue将一些JSON数据转换为拼花地板。我们尝试的一个场景是在拼花地板表中添加一列。所以分区1有列[A],分区2有列[A,B]。然后我们想编写更多的Glue ETL作业来聚合拼花地板表,但新列不可用。使用glue\u context.create\u dynamic\u frame.from\u catalog加载动态框架,我们的新列从未出现在架构中 我们为我们的表爬虫尝试了几种配置。所有分区使用单一模式,s3路径使用单一模式,每个分区使用单一模式。我们总是可以在Glue表数

我们一直在探索使用Glue将一些JSON数据转换为拼花地板。我们尝试的一个场景是在拼花地板表中添加一列。所以分区1有列[A],分区2有列[A,B]。然后我们想编写更多的Glue ETL作业来聚合拼花地板表,但新列不可用。使用
glue\u context.create\u dynamic\u frame.from\u catalog
加载动态框架,我们的新列从未出现在架构中

我们为我们的表爬虫尝试了几种配置。所有分区使用单一模式,s3路径使用单一模式,每个分区使用单一模式。我们总是可以在Glue表数据中看到新列,但是如果我们使用pyspark从Glue作业中查询它,它总是空的。当我们下载一些样本并通过雅典娜查询时,专栏就在拼花地板上


为什么pyspark无法使用新列?

这是一个spark配置问题。发件人:

与ProtocolBuffer、Avro和Thrift一样,Parquet也支持模式演化。用户可以从一个简单的模式开始,然后根据需要逐渐向该模式添加更多的列。通过这种方式,用户可能最终得到具有不同但相互兼容模式的多个拼花文件。拼花数据源现在能够自动检测这种情况并合并所有这些文件的模式

由于模式合并是一个相对昂贵的操作,并且在大多数情况下不是必需的,因此我们从1.5.0开始默认关闭它。您可以通过以下方式启用它:

  • 读取拼花地板文件时,将数据源选项mergeSchema设置为true(如下例所示),或
  • 将全局SQL选项spark.SQL.parquet.mergeSchema设置为true
  • 我们可以通过两种方式实现模式合并

  • 在spark会话
    spark.conf.set(“spark.sql.parquet.mergeSchema”,“true”)上设置选项
  • 加载动态帧时,在
    附加_选项中将
    mergeSchema
    设置为true
    source=glueContext.create\u dynamic\u frame.from\u catalog(
    database=“db”,
    table_name=“table”,
    其他_选项={“mergeSchema”:“true”}
    )
    
    之后,新列在框架的模式中可用