如何在运行于amazonemr的presto中向分区表添加分区?

ivqmmu1c  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(632)

我在emr5.19.0中运行apachepresto 0.212,因为aws athena不支持presto支持的用户定义函数。我正在使用配置为使用粘合模式的emr。我有预先存在的Parquet文件,它们已经以正确的分区格式存在于s3中。
最近的presto版本似乎已经取消了创建和查看分区的功能。这就提出了一个问题:如何添加单个分区?我可以在aws中使用雅典娜控制台 MSCK REPAIR mytable; 这样就可以正确地创建分区,然后我可以使用presto cli或hue成功地查询分区。但是,在普雷斯托我该怎么做呢?
如果我试试这个 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中存储模式。这就是“默认”的来源。)
在普雷斯托这样做的老方法最近都被删除了( alter table mytable add partition (p1=value, p2=value, p3=value) 或者 INSERT INTO TABLE mytable PARTITION (p1=value, p2=value, p3=value) ,尽管在测试中仍然可以找到它。它们不起作用。如果我尝试在hue或presto cli中执行这样的查询,就会出现错误。
但是,在presto cli中,我可以查看存在的分区,在emr主节点上输入以下查询:

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

最初,查询结果是空的,因为不存在分区。如果我在athena中手动运行msck repair来创建分区,那么该查询将显示已创建的所有分区。
如果我尝试在emr主节点上使用hivecli,它将不起作用。

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甚至hivecli向存储在s3中的分区表添加分区?既然普雷斯托已经取消了这样做的能力,那么应该怎么做呢?试图仿效前面的例子是行不通的。
虽然“msck修复”是可行的,但这是一种昂贵的方法,会导致一次完整的s3扫描。我更喜欢单独添加分区,而不是扫描整个s3 bucket来查找现有分区,特别是在向已经存在的大型表中添加一个新分区时。
我还注意到,第页的这段引用使用aws glue数据目录作为配置单元的元存储:
我们建议通过amazonemr使用应用程序创建表,而不是直接使用aws胶水创建表。通过aws glue创建表可能会导致缺少必需字段并导致查询异常。
在emr中必须有这样一种方法。它是什么?

qmb5sa22

qmb5sa221#

事实证明,在emr中,hive和presto需要单独的配置才能使用glue目录。因此,我的awscli脚本需要修改,以包含每个脚本的配置,以便能够做到这一点。配置结果如下所示:

--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就可以用如下语句创建分区

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);

相关问题