Я использую 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 должен быть способ сделать это.Что это?