为什么我的胶水 table 使用错误的路径创建?

why is my glue table creating with the wrong path?

我在 AWS Glue 中使用由 Airflow 编排的 spark 作业创建一个 table,它从 json 读取并写入 table,我在工作如下:

spark.sql(s"CREATE TABLE IF NOT EXISTS $database.$table using PARQUET LOCATION '$path'")

奇怪的是,我还有其他 table 使用相同的作业(名称不同)创建的,但它们的创建没有问题,例如他们有位置

s3://bucket_name/databases/my_db/my_perfectly_created_table

正好有一个 table 在这个位置创建自己:

s3://bucket_name/databases/my_db/my_problematic_table-__PLACEHOLDER__

我不知道 -__PLACEHOLDER__ 是从哪里来的。我已经尝试删除 table 并重新创建它,但它总是在这个 table 上做同样的事情。路径中的数据为 parquet 格式:

s3://bucket_name/databases/my_db/my_problematic_table

所以我知道问题只是正确地创建了 table 因为我在 Athena 中尝试查询它时得到的只是 col (array<string>) (因为 /my_problematic_table-__PLACEHOLDER__ 中没有数据).

你们中有人处理过这个问题吗?

在 AWS glue 中仔细检查后,这个特定的 problematic_table 具有以下配置,特定于 CSV 文件和自定义分隔符:

Input Format    org.apache.hadoop.mapred.SequenceFileInputFormat
Output Format   org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
Serde serialization library org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

而我的其他 table 具有镶木地板专用配置:

Input Format    org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
Output Format   org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
Serde serialization library     org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe

我尝试使用以下命令创建 table 强制配置 parquet:

val path = "s3://bucket_name/databases/my_db/my_problematic_table/"
val my_table = spark.read.format("parquet").load(path)
val ddlSchema = my_table.toDF.schema.toDDL

    spark.sql(s"""
      |CREATE TABLE IF NOT EXISTS my_db.manual_myproblematic_table($ddlSchema)
      |ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
      |STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
      |OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
      |LOCATION '$path'
      |""".stripMargin
    )

但它引发了以下错误:

org.apache.spark.SparkException: Cannot recognize hive type string: struct<1:string,2:string,3:string>, column: problematic_column

所以问题在于该结构中那些列“1”、“2”和“3”的命名。

鉴于此结构不包含有价值的信息,我最终放弃了它并重新创建了 table。现在它像一个魅力一样工作并且它在胶水中具有正确的(镶木地板)配置。

希望对大家有帮助