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

问题描述 投票:0回答:1

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

最近的Presto版本似乎已经删除了创建和查看分区的功能。这提出了一个问题:如何添加单个分区?我可以在AWS中使用Athena控制台并运行MSCK REPAIR mytable;并正确创建分区,然后我可以使用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中的分区表中吗?既然Presto已经取消了这样做的能力,应该采取什么样的方式呢?试图遵循像this one这样的早期例子是行不通的。

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

我还在页面Using the AWS Glue Data Catalog as the Metastore for Hive上注意到这个引用:

我们建议通过Amazon EMR使用应用程序创建表,而不是使用AWS Glue直接创建表。通过AWS Glue创建表可能会导致缺少必填字段并导致查询异常。

在EMR中必须有这样做的方法。它是什么?

hive amazon-emr parquet presto hadoop-partitioning
1个回答
0
投票

事实证明,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);
© www.soinside.com 2019 - 2024. All rights reserved.