在胶水作业中更新分区后无法从雅典娜查询胶水表

时间:2020-04-20 13:09:51

标签: apache-spark aws-glue amazon-athena aws-glue-data-catalog

我们对Glue / Athena有一个奇怪的问题。我们在没有预定义架构的Cloud Formation中创建了Glue表,以利用动态框架:

OurGlueTable:
Type: AWS::Glue::Table
Properties:
  DatabaseName: !Ref OurGlueDatabase
  CatalogId: !Ref AWS::AccountId
  TableInput:
    Name: "device"
    Description: "Device table"
    TableType: EXTERNAL_TABLE
    Parameters: {"classification": "glueparquet"}
    StorageDescriptor:
      Compressed: false
      InputFormat: "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat"
      OutputFormat: "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat"
      SerdeInfo:
        SerializationLibrary: "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe"
        Parameters: {serialization.format: 1}
      Location: !Ref ExternalTableDataS3Location
      StoredAsSubDirectories: false

我们将数据保存到scala spark Glue(1.0版)ETL中的该表中:

  override def saveData(transformedDataFrame: DataFrame): Unit = {
    val frameWithDateColumns: DataFrame = addMissingColumns(transformedDataFrame)
    val dynamicFrame = DynamicFrame.apply(frameWithDateColumns, glueContext)
    val sink: DataSink = getSink
    sink.writeDynamicFrame(dynamicFrame)
  }
  private def addMissingColumns(transformedDataFrame: DataFrame): DataFrame = {
    import org.apache.spark.sql.functions._
    transformedDataFrame
      .withColumn("year", lit(processingYear))
      .withColumn("month", lit(processingMonth))
      .withColumn("day", lit(processingDay))
  }
  private def getSink = {
    val database = config.getString("database")
    val table = config.getString("table")
    val options: JsonOptions = JsonOptions(Map("partitionKeys" -> Seq("year", "month", "day"), "enableUpdateCatalog" -> true))
    val format = "glueparquet"
    val sink = glueContext.getCatalogSink(database = database, tableName = table, additionalOptions = options)
    sink.setFormat(format, JsonOptions(Map()))
    sink
  }

完成第一份工作后,将进行胶合表架构和分区更新,并且我们能够在Athena中读取数据。在具有相同输入数据和不同day参数的第二项作业之后(将创建不同的分区),胶水表架构保持不变,并且可以在胶水表控制台中看到新分区(正确),但是这次是在Athena中读取数据有:

HIVE_METASTORE_ERROR:com.facebook.presto.spi.PrestoException:错误:预期在'long'位置0处输入类型,但找到了'long'。 (服务:空;状态代码:0;错误代码:空;请求ID:空)

当我们尝试使用MSCK REPAIR TABLE刷新分区时,出现另一个错误

失败:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。名称为空

重要的是,如果我们并行运行作业两天,我们便能够在Athena中读取数据,则仅当有一项作业接一个作业时才会发生此问题。

我们已经尝试在Cloud Formation中更改表定义,以创建具有预定义分区(年,月,日)的表,并将StoredAsSubDirectories更改为true,但此方法无效。

在执行我们的代码时,我们遵循文章Auth service

有人有类似的问题吗?

0 个答案:

没有答案