我们对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。
有人有类似的问题吗?