hive - 如何将分区添加到在 Amazon EMR 中运行的 Presto 中的分区表?
问题描述
我在 EMR 5.19.0 中运行 Presto 0.212,因为 AWS Athena 不支持 Presto 支持的用户定义函数。我正在使用配置为使用胶水模式的 EMR。我有预先存在的 Parquet 文件,这些文件已经在 S3 中以正确的分区格式存在。
最近的 Presto 版本似乎删除了创建和查看分区的功能。这就提出了一个问题:如何添加单独的分区?我可以在 AWS 中使用 Athena 控制台并运行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 中的数据库来存储模式。这就是“默认”的来源。)
在 Presto 中执行此操作的旧方法最近都已被删除(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 主节点上使用 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 已经去掉了这样做的能力,那它应该怎么做呢?试图遵循前面的例子,比如这个是行不通的。
虽然“MSCK REPAIR”有效,但这样做的成本很高,并且会导致完整的 S3 扫描。我更愿意单独添加分区,而不是扫描整个 S3 存储桶来查找现有分区,尤其是在将一个新分区添加到已经存在的大表时。
我还在Using the AWS Glue Data Catalog as the Metastore for Hive页面上注意到了这句话:
我们建议通过 Amazon EMR 使用应用程序创建表,而不是直接使用 AWS Glue 创建表。通过 AWS Glue 创建表可能会导致必填字段缺失并导致查询异常。
在 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);
推荐阅读
- pine-script - 为累积图表添加总和的问题
- c# - 如何查找匿名对象的所有 DateTime 属性?
- android - 如何获取当前周/月的第一天和最后一天
- testing - 如何在 Rust 中的测试和工作台之间共享代码?
- android - 如何设置每日本地提醒。每周和每月?
- javascript - 如何过滤数组以仅返回白名单中包含至少一个嵌套属性的项目?
- google-apps-script - 如何更新在默认 GCP 项目中制作的电子表格插件?
- javascript - VueJS 数字格式在输入 Intl.NumberFormat 时以逗号分隔
- vba - 从 ListBoxes 中选择的项目是表中的过滤器 .criteria1
- reactjs - 使用 ReadableStream 作为 HTML