我们创建了一个 Hudi 数据集,它有这样的两级分区
s3://somes3bucket/partition1=value/partition2=value
wherepartition1
和partition2
是类型string
使用format in运行简单count
查询时,大约需要 3 分钟才能完成Hudi
spark-shell
spark.read.format("hudi").load("s3://somes3bucket").
where("partition1 = 'somevalue' and partition2 = 'somevalue'").
count()
res1: Long = ####
attempt 1: 3.2 minutes
attempt 2: 2.5 minutes
这也是 Spark UI 中的指标,其中大约 9000 个任务(大约相当于整个数据集中的文件总数)用于s3://somes3bucket
计算。似乎 spark 正在读取整个数据集而不是分区修剪......然后根据where
子句过滤数据集
然而,如果我使用该parquet
格式来读取数据集,查询只需要大约 30 秒(相对于 Hudi 格式的 3 分钟)
spark.read.parquet("s3://somes3bucket").
where("partition1 = 'somevalue' and partition2 = 'somevalue'").
count()
res2: Long = ####
~ 30 seconds
这是 spark UI,仅扫描了 1361 个文件(在 Hudi 中相对于 ~9000 个文件)并且只需要 15 秒
Hudi
知道为什么在使用格式时分区修剪不起作用吗?想知道我在创建数据集的过程中是否遗漏了任何配置?
PS:我运行了这个emr-6.3.0
有 Hudi 版本的查询0.7.0