1

我们创建了一个 Hudi 数据集,它有这样的两级分区

s3://somes3bucket/partition1=value/partition2=value

wherepartition1partition2是类型string

使用format in运行简单count查询时,大约需要 3 分钟才能完成Hudispark-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

4

0 回答 0