如何将分区添加到 Amazon EMR 中 Presto 运行 中的分区 table?

How do you add partitions to a partitioned table in Presto running in Amazon EMR?

我运行在 EMR 5.19.0 中使用 Presto 0.212,因为 AWS Athena 不支持 Presto 支持的用户定义函数。我正在使用配置为使用粘合模式的 EMR。我有预先存在的 Parquet 文件,这些文件已经以正确的分区格式存在于 S3 中。

最近的 Presto 版本似乎删除了创建和查看分区的功能。这就提出了一个问题:如何添加单独的分区?我可以在 AWS 和 运行 MSCK REPAIR mytable; 中使用 Athena 控制台并正确创建分区,然后我可以使用 Presto CLI 或 HUE 成功查询。但是,如何在 Presto 中执行此操作?

如果我在 EMR 主节点上的 presto-cli 中尝试此操作:

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

(请注意,我在 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)),尽管 still found in the tests 它出现了。他们不工作。如果我尝试在 HUE 或 Presto CLI 中执行此类查询,我会收到错误消息。

但是,在 Presto CLI 中,我可以查看存在的分区,在 EMR 主节点上输入此查询:

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

最初那个查询结果是空的,当然是因为不存在分区。如果我在 Athena 中手动 运行 MSCK REPAIR 来创建分区,那么该查询将显示所有已创建的分区。

如果我尝试在 EMR 主节点上使用 HIVE CLI,它不起作用。

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 中的分区 table?现在 Presto 已经取消了执行此操作的能力,它应该以什么方式完成?尝试遵循早期示例(例如 this one)是行不通的。

虽然“MSCK REPAIR”有效,但这是一种昂贵的方法,并且会导致完整的 S3 扫描。我更愿意单独添加分区,而不是扫描整个 S3 存储桶来查找现有分区,尤其是在将一个新分区添加到已经存在的大型 table 时。

我还在 Using the AWS Glue Data Catalog as the Metastore for Hive 页注意到了这句话:

We recommend creating tables using applications through Amazon EMR rather than creating them directly using AWS Glue. Creating a table through AWS Glue may cause required fields to be missing and cause query exceptions.

在 EMR 中必须有一种方法可以做到这一点。这是什么?

原来EMR中的Hive和Presto需要单独配置才能使用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);