тип LIST не поддерживается при запросе AWS Athena в таблице, созданной с помощью AWS Glue Catalog.

Я написал задание ETL для преобразования кучи файлов JSON в файлы (объекты) паркета с временным разделением, хранящиеся на S3.

Вместо того, чтобы вручную создавать таблицы в AWS Athena и использовать каталог данных Athena, я решил использовать хранилище данных AWS Glue, которое сканировало преобразованные файлы паркета и генерировало схему, которая кажется правильной. Это:

CREATE EXTERNAL TABLE `table_fd2f388f79ee6`(
  `field1` string, 
  `field2` string, 
  `data` struct<attrib1:string,gpId:string,attrib2:boolean,attrib3:array<string>,attrib4:struct<f1:int,f2:int>>)
PARTITIONED BY ( 
  `year` string, 
  `month` string, 
  `day` string)
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
  's3://path'
TBLPROPERTIES (
  'CrawlerSchemaDeserializerVersion'='1.0', 
  'CrawlerSchemaSerializerVersion'='1.0', 
  'UPDATED_BY_CRAWLER'='crawlername', 
  'averageRecordSize'='17', 
  'classification'='parquet', 
  'compressionType'='none', 
  'objectCount'='2', 
  'recordCount'='726', 
  'sizeKey'='287', 
  'typeOfData'='file')

однако даже для простого select * запроса я получаю сообщение об ошибке:

HIVE_CANNOT_OPEN_SPLIT: Ошибка при открытии Hive split s3: //bucket/year=2018/month=07/day=03/part-00258-e1bcec61-f24e-40a2-8fac-fdd017054c2a.c000.snappy.parquet (offset = 0, length = 5356): данные столбца. Тип атрибута LIST не поддерживается

Это ошибка, ограничение или что-то, что мне нужно исправить?


person siberiancrane    schedule 07.08.2018    source источник


Ответы (1)


Поля вашей таблицы Athena должны быть точно объявлены в том же порядке, что и схема Parquet, иначе это не удастся!

если у вас схема паркета:

id: integer (nullable = false)
rating: struct (nullable = true)
  related_to: struct (nullable = true)
       category: integer (nullable = false)
       name: float (nullable = true)
       type: string (nullable = false)
  rating_results: array (nullable = true)
       element: struct (containsNull = true)
            toto: integer (nullable = false)
            tata: float (nullable = true)
            titi: string (nullable = true)
other: string (nullable = true)

Стол Афины должен быть:

`id` INT,
`rating` STRUCT<
                 `related_to`: STRUCT<
                         `category`: INT,
                         `name`: FLOAT,
                         `type`: STRING
                 >,
                 rating_results : ARRAY<
                            STRUCT<
                            toto: INT,
                            tata: FLOAT,
                            titi: STRING>
                            >
                 >,
`other` STRING

По-видимому, AWS ATHENA не устанавливает по умолчанию параметр SERDE:

'hive.parquet.use-column-names' = 'true'

и не применяйте его, когда вы устанавливаете его в WITH SERDEPROPERTIES


Также будьте осторожны, если ваш паркетный файл экспортируется с помощью Spark, обратите внимание на эту опцию.

"spark.sql.parquet.writeLegacyFormat", true

подробнее здесь: Разница в результатах запроса между EMR-Presto и Athena

и последний совет, будьте осторожны с десятичным типом (он фиксируется в presto, но не в athena): https://github.com/prestodb/presto/issues/7232

person raphaelauv    schedule 13.03.2019