求助:AWS Glue读取表时丢失全空列如何解决
解决AWS Glue读取时保留全空列的问题
方法1:Spark SQL读取后转DynamicFrame(最稳妥)
Spark SQL会严格遵循Glue Data Catalog的表定义,保留所有列(包括全空列),读取后再转为Glue DynamicFrame即可:
# 用Spark SQL读取目标表 spark_df = spark.sql("SELECT * FROM database.table") # 转换为Glue DynamicFrame dF = DynamicFrame.fromDF(spark_df, glueContext, "dynamic_frame_with_all_cols") # 验证schema,确认全空列已保留 dF.printSchema()
方法2:基于Catalog schema手动映射列
如果必须使用from_catalog读取,可以先拉取表的元数据schema,生成映射规则强制保留所有列:
import boto3 # 初始化Glue客户端 glue_client = boto3.client('glue') # 获取目标表的元数据信息 table_meta = glue_client.get_table( DatabaseName="database", Name="table" ) # 生成applyMapping需要的映射规则(原列名-原类型->目标列名-目标类型) mapping_rules = [] for col in table_meta['Table']['StorageDescriptor']['Columns']: mapping_rules.append( (col['Name'], col['Type'], col['Name'], col['Type']) ) # 读取DynamicFrame raw_dF = glueContext.create_dynamic_frame.from_catalog( database="database", table_name="table" ) # 应用映射规则,强制保留所有列 dF_with_all_cols = raw_dF.applyMapping(mapping=mapping_rules) # 验证schema dF_with_all_cols.printSchema()
方法3:修改读取配置参数(视版本/数据格式生效)
部分Glue版本中,可通过additional_options禁用空列自动删除:
dF = glueContext.create_dynamic_frame.from_catalog( database="database", table_name="table", additional_options={ "dropNullFields": "false" } ) # 验证schema dF.printSchema()
注意:如果数据格式是CSV这类无自描述schema的格式,需确保Glue Data Catalog中的列定义完全准确,否则上述方法可能无法生效。
内容的提问来源于stack exchange,提问作者RAHUL DHANOLA
相关产品推荐
相关产品推荐

