我在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中必须有这样做的方法。它是什么?
事实证明,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);