HIVE_CANNOT_OPEN_SPLIT: несоответствие схемы при запросе файлов паркета из Athena

Я получаю сообщение об ошибке несоответствия схемы при запросе данных паркета от Athena.

Ошибка:

HIVE_CANNOT_OPEN_SPLIT: Error opening Hive split s3://datalake/googleanalytics/version=0/eventDate=2017-06-11/part-00001-9c9312f7-f9a5-47c3-987e-9348b78aaebc-c000.snappy.parquet (offset=0, length=48653579): Schema mismatch, metastore schema for row column totals has 13 fields but parquet schema has 12 fields

В AWS Glue Crawler я попытался включить Обновлять все новые и существующие разделы с помощью метаданных из таблицы, что, как я думал, решит эту проблему, однако я все еще получаю указанную выше ошибку. Я сделал это из-за аналогичного вопроса: Как создать таблицу AWS Glue, в которой разделы имеют разные столбцы? ('HIVE_PARTITION_SCHEMA_MISMATCH')

Схема таблицы для итогового столбца:

struct<visits:bigint,hits:bigint,pageviews:bigint,timeOnSite:bigint,bounces:bigint,transactions:bigint,transactionRevenue:bigint,newVisits:bigint,screenviews:bigint,uniqueScreenviews:bigint,timeOnScreen:bigint,totalTransactionRevenue:bigint,sessionQualityDim:bigint>

В файле паркета для раздела eventDate = 2017-06-11 отсутствует последнее поле "sessionQualityDim".


person AndrewSC    schedule 21.05.2019    source источник
comment
разделены ли ваши данные паркета на основе столбца eventDate? Если да, то это не будет частью схемы в таблице athena. Вместо этого при создании таблицы передайте столбец eventDate в раздел по параметрам.   -  person Harsh Bafna    schedule 21.05.2019
comment
@HarshBafna Да, он разбит на eventDate. Таблица создается краулером Glue. DDL для таблицы содержит PARTITIONED BY ('eventdate' string)   -  person AndrewSC    schedule 21.05.2019
comment
выглядит как s3: //datalake/googleanalytics/version=0/eventDate=2017-06-11/part-00001-9c9312f7-f9a5-47c3-987e-9348b78aaebc-c000.snappy.parquet имеет только 12 столбцов в своей схеме, поскольку по сравнению с 13, определенными в таблице Афины. Используйте github.com/apache/parquet-mr/tree/master/parquet -tools, чтобы найти схему этого файла.   -  person Harsh Bafna    schedule 21.05.2019
comment
предоставьте вывод команды parquet-tools schema ‹your_parquet_file›.   -  person Harsh Bafna    schedule 21.05.2019
comment
@HarshBafna У меня пока нет инструментов для паркета. Однако я использовал Spark DataFrame.printSchema() для отображения схемы:   -  person AndrewSC    schedule 21.05.2019
comment
сейчас: |-- totals: struct (nullable = true) |-- visits: long (nullable = true) |-- hits: long (nullable = true) |-- pageviews: long (nullable = true) |-- timeOnSite: long (nullable = true) |-- bounces: long (nullable = true) |-- transactions: long (nullable = true) |-- transactionRevenue: long (nullable = true) |-- newVisits: long (nullable = true) |-- screenviews: long (nullable = true) |-- uniqueScreenviews: long (nullable = true) |-- timeOnScreen: long (nullable = true) |-- totalTransactionRevenue: long (nullable = true) |-- sessionQualityDim: long (nullable = true)   -  person AndrewSC    schedule 21.05.2019
comment
sessionQualityDim отсутствует в схеме 2017 года. Схема 2017 - это подмножество схемы таблицы. Я ожидал, что параметр Обновить все новые и существующие разделы метаданными из таблицы сработает.   -  person AndrewSC    schedule 21.05.2019
comment
В схеме таблицы, которую вы поделили в исходном сообщении, я не вижу столбца итогов, который является частью вашего фрейма данных, который, как я полагаю, создан из того же файла паркета, который упоминается в вопросе.   -  person Harsh Bafna    schedule 21.05.2019
comment
Хорошо, одна и та же таблица athena не может указывать на паркетные файлы с другой схемой. Вам понадобятся две разные таблицы athena для чтения старой и новой версии данных.   -  person Harsh Bafna    schedule 21.05.2019


Ответы (1)


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

1) Создайте две разные таблицы в Афине, одна указывает на данные до 2017 года, а другая указывает на публикацию данных 2017 года.

2) Если более старые данные больше не подходят для текущего варианта использования, вы можете просто заархивировать эти данные и удалить разделы 2017 года и более ранние из текущей таблицы.

person Harsh Bafna    schedule 21.05.2019
comment
Если изменение схемы было «Добавить столбец», можно ли это как-то обойти? - person TechCrap; 12.02.2020
comment
@TechCrap: вышеуказанные решения являются только временным решением. Поскольку Athena не является традиционной СУБД, она накладывает схему поверх данных, лежащих в S3. Проблема здесь в данных с другой схемой, поэтому таблица может читать любой из этих данных. старый или новый. - person Harsh Bafna; 12.02.2020