Я создал сканер клея для чтения журналов доступа Apache. Ниже приведено определение таблицы, который сканер создал в каталоге данных Glue. Мне удалось получить приведенный ниже оператор DDL из Афины.
CREATE EXTERNAL TABLE crawler_access_log(
.. Other column names
timestamp string COMMENT 'from deserializer'
) ROW FORMAT SERDE
'com.amazonaws.glue.serde.GrokSerDe'
WITH SERDEPROPERTIES (
'input.format'='%{COMBINEDAPACHELOG}')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://some location'
TBLPROPERTIES (
'CrawlerSchemaDeserializerVersion'='1.0',
'CrawlerSchemaSerializerVersion'='1.0',
'UPDATED_BY_CRAWLER'='crawler_access_log',
'averageRecordSize'='268',
'classification'='combinedapache',
'compressionType'='gzip',
'grokPattern'='%{COMBINEDAPACHELOG}',
'objectCount'='2',
'recordCount'='71552',
'sizeKey'='25268746',
'typeOfData'='file')
//SAMPLE TIMESTAMP (Data type as string) COULMN DATA
20/Jul/2018:03:27:44 +0000
20/Jul/2018:03:27:44 +0000
Но когдаЯ читаю данные из той же таблицы через glueContext, тип данных столбца timestamp
становится date
вместо string
. Я использую приведенный ниже код для чтения данных из таблицы.
val rawDynamicDataFrame = glueContext.getCatalogSource(database = "someDB",
tableName = "crawler_access_log", redshiftTmpDir = "", transformationContext
= "rawDynamicDataFrame").getDynamicFrame();
Когда я выполняю printSchema и вижу данные динамического фрейма данных, я вижу, что столбец timestamp
имеет тип данных date
вместо string
. Поэтому данные усекаются.
scala> rawDynamicDataFrame.printSchema
root
|-- xx: string
|-- xx: string
|-- xx: string
|-- timestamp: date
|-- xx: string
|-- xx: string
|-- xx: string
scala> rawDynamicDataFrame.show(2)
2018-07-20 ///Original (20/Jul/2018:03:27:44 +0000)
2018-07-20 ///Original (20/Jul/2018:03:27:44 +0000)
Я не могу понять, почему типы данных меняются, даже если клей считывает данные из каталога клея.