Как добавить разделы в многораздельную таблицу в Presto, работающем в Amazon EMR? - PullRequest
0 голосов
/ 13 ноября 2018

Я использую Apache Presto 0.212 в EMR 5.19.0, потому что AWS Athena не поддерживает пользовательские функции, которые поддерживает Presto.Я использую EMR, настроенный на использование схемы клея.У меня есть ранее существующие файлы Parquet, которые уже существуют в правильном многораздельном формате в S3.

Похоже, что в последних версиях Presto была удалена возможность создавать и просматривать разделы.Возникает вопрос: как добавить отдельные разделы?Я могу использовать консоль Athena в AWS и запускать MSCK REPAIR mytable;, и это правильно создает разделы, которые я могу затем успешно запросить, используя Presto CLI или HUE.Тем не менее, как мне это сделать в Presto?

Если я попытаюсь это сделать в presto-cli на главном узле EMR:

use hive.default;
INSERT INTO "mytable$partitions" VALUES (2018, 9, 20)

Я получу сообщение об ошибке

java.sql.SQLException: Query failed (#20181113_172115_00004_yywie): com.facebook.presto.connector.system.SystemTableHandle cannot be cast to com.facebook.presto.hive.HiveTableHandle

(Обратите внимание, что я использую базу данных default в Glue для хранения схемы. Отсюда и "default".)

Старые способы сделать это в Presto все относительно удаленынедавно (alter table mytable add partition (p1=value, p2=value, p3=value) или INSERT INTO TABLE mytable PARTITION (p1=value, p2=value, p3=value), например), хотя все еще найден в тестах , он появляется.Они не работаютЕсли я пытаюсь выполнить такие запросы в HUE или в CLI Presto, я получаю ошибки.

Однако в CLI Presto я могу просматривать существующие разделы, вводя этот запрос на главном узле EMR:

use hive.default;
select * from "mytable$partitions";

Первоначально этот результат запроса является пустым, потому что, конечно, разделов не существует.Если я вручную запускаю MSCK REPAIR в Афине для создания разделов, то в этом запросе будут показаны все созданные разделы.

Если я попытаюсь использовать CLI HIVE на главном узле EMR, он не будетработа.

use default;
ALTER TABLE mytable
    ADD PARTITION (p1=2018, p2=9, p3=20)
    location 's3://bucketname/rootfolder/p1=2018/p2=9/p3=20/';

FAILED: SemanticException [Error 10001]: Table not found mytable

Итак ... как, используя Presto-CLI, HUE или даже Hive CLI, я могу добавить разделы в секционированную таблицу, хранящуюся в S3?Теперь, когда Presto лишил возможности делать это, как это должно быть сделано?Попытка следовать более ранним примерам, таким как , этот не работает.

Хотя «MSCK REPAIR» работает, это дорогой способ сделать это и вызвать полное сканирование S3.Я бы предпочел добавлять разделы по отдельности, а не сканировать всю корзину S3, чтобы найти существующие разделы, особенно при добавлении одного нового раздела в большую таблицу, которая уже существует.

Я также отмечаю эту цитату на странице ИспользованиеКаталог данных клея AWS в качестве Metastore for Hive :

Мы рекомендуем создавать таблицы с помощью приложений через Amazon EMR, а не создавать их напрямую с помощью AWS Glue.Создание таблицы с помощью AWS Glue может привести к отсутствию обязательных полей и возникновению исключений в запросах.

В EMR должен быть способ сделать это.Что это?

1 Ответ

0 голосов
/ 14 ноября 2018

Оказывается, что Hive и Presto в EMR требуют отдельной конфигурации, чтобы иметь возможность использовать каталог Glue. Таким образом, мой сценарий AWS CLI необходимо было изменить, чтобы он содержал конфигурацию для каждого, чтобы можно было это сделать. Конфигурация в итоге выглядела так:

--configurations '[
                    {
                      "Classification": "presto-connector-hive",
                      "Properties": { "hive.metastore.glue.datacatalog.enabled": "true" },
                      "Configurations":[]
                    },
                    {
                      "Classification": "hive-site",
                      "Properties": { "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" }
                    }
                  ]'

Похоже, что текущие версии Presto не могут создавать или просматривать разделы напрямую, но Hive может. Моя проблема заключалась в том, что Hive не был настроен на просмотр каталога Glue. Как только я это исправил, Hive смог создать разделы с такими утверждениями, как

ALTER TABLE mytable ADD IF NOT EXISTS
    PARTITION (p1=2018, p2=9, p3=18)
    PARTITION (p1=2018, p2=9, p3=19)
    PARTITION (p1=2018, p2=9, p3=20);
...