AWS Spectrum 真的需要 = in s3 location 才能将其理解为 hive 格式吗?

Posted

技术标签:

【中文标题】AWS Spectrum 真的需要 = in s3 location 才能将其理解为 hive 格式吗?【英文标题】:Do AWS Spectrum really need = in s3 location to understand it as hive format? 【发布时间】:2021-03-02 15:09:21 【问题描述】:

我用spectrum 运行了一些测试。

我创建了两个AWS Glue crawler

第一个名为hive-tst的扫描:

s3://hive-test/type='a'/year='2021'/month='01'
s3://hive-test/type='b'/year='2021'/month='01'
s3://hive-test/type='c'/year='2021'/month='01'
s3://hive-test/type='d'/year='2021'/month='01'
s3://hive-test/type='e'/year='2021'/month='01'

第二个扫描:

s3://non-hive-test/a/2021/01
s3://non-hive-test/b/2021/01
s3://non-hive-test/c/2021/01
s3://non-hive-test/d/2021/01
s3://non-hive-test/e/2021/01

每个bucket分区都有两个文件,两个文件都是parquet文件,大小为50mb。

然后我运行一个查询每个spectrum 表的第一个分区的测试:

select distinct event from test.hive_tst; 

花了 8s 272

select distinct partition_0 from test.nonhive_tst; 

耗时 8s 66ms

所以添加= 似乎并没有提高性能。 还检查了两个表在分区中都有Hive 格式。

select *
from svv_external_partitions
where schemaname='test'
and tablename='hive_tst';
values location input_format output_format serialization_lib
["a","2021","01"] s3://hive-test/event=a/year=2021/month=01/ org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
select *
from svv_external_partitions
where schemaname='test'
and tablename='nonhive_tst';
values location input_format output_format serialization_lib
["a","2021","01"] s3://hive-test/a/2021/01/ org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe

也许文件夹中的数据量不足以测试它,但使用svv_external_partitions 的所有内容、执行时间和分区格式似乎都一样。

那么问题是:

AWS Spectrum 真的需要在 s3 位置中将 = 理解为 hive 格式吗?

【问题讨论】:

两个存储桶的分区名称及其值之间都有=。哪里应该有区别?顺便说一句,我不希望 ' 围绕这些值。 @luk2302 输入错误,已修复 【参考方案1】:

最后,经过大量搜索和阅读,我得出一个结论: S3 两个桶都有分区,当我们使用AWS Glue 时,所有分区都会自动添加。

唯一的区别是year=2020这样的前缀对应于hive命名约定,所以AWS Glue在添加分区时知道如何处理,然后分区有一个漂亮的名字比如year而不是@987654328 @。

然后,回答:AWS Spectrum 真的需要在 s3 位置将 = 理解为 hive 格式吗?

不,您不需要将其理解为hive 格式,而是通过Hive 命名约定来理解它

来源

    上面我自己的测试 AWS Glue partitioned data post Hive naming convention on S3

【讨论】:

以上是关于AWS Spectrum 真的需要 = in s3 location 才能将其理解为 hive 格式吗?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Spectrum 扫描错误压缩文件意外结束

从 AWS Glue 表到 RedShift Spectrum 外部表的日期字段转换

AWS Spectrum 为 AWS Glue 生成的镶木地板文件提供空白结果

如何通过 AWS Quicksight 连接到 Redshift Spectrum 上的外部架构/表?

扫描外部表(S3 数据)时 Redshift Spectrum 中的成本控制

Redshift Spectrum 读取文件的数据格式是啥?