【问题标题】:why is my glue table creating with the wrong path?为什么我的胶水表创建路径错误?
【发布时间】:2021-11-27 03:49:50
【问题描述】:

我正在使用 Airflow 编排的 Spark 作业在 AWS Glue 中创建一个表,它从 json 读取并写入一个表,我在作业中使用的命令如下:

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

这里的奇怪之处在于,我使用相同的作业(具有不同的名称)创建了其他表,但它们的创建没有问题,例如他们有位置

s3://bucket_name/databases/my_db/my_perfectly_created_table

只有一个表使用这个位置创建自己:

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

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

s3://bucket_name/databases/my_db/my_problematic_table

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

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

【问题讨论】:

    标签: apache-spark apache-spark-sql parquet aws-glue amazon-athena


    【解决方案1】:

    在 AWS 胶水中仔细检查后,这个特定的 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
    

    而我的其他表具有特定于镶木地板的配置:

    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
    

    我尝试使用以下命令创建强制配置镶木地板的表:

    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”。

    鉴于此结构不包含有价值的信息,我最终将其删除并再次创建表。现在它就像一个魅力,它在胶水中具有正确的(镶木地板)配置。

    希望这对任何人都有帮助

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多