使用过滤器时,spark是否会从Kudu加载所有数据?

时间:2019-08-14 09:46:03

标签: apache-spark kudu

我是新来的火花。以下代码将加载所有数据还是仅过滤来自kudu的数据?

val df: DataFrame = spark.read.options(Map(
   "kudu.master" -> kuduMaster,
   "kudu.table" -> s"impala::platform.${table}")).kudu

val outPutDF = df.filter(row => {
     val recordAt: Long = row.getAs("record_at").toString.toLong
     recordAt >= XXX && recordAt < YYY
   })

2 个答案:

答案 0 :(得分:1)

对于给定的连接器,检查过滤器是否被按下的最简单方法是使用Spark UI
Spark中的扫描节点将具有从数据源读取的记录数的度量。(您可以检查此Spark UI-> SQL选项卡,然后运行查询)
在有或没有显式谓词的情况下(在小型数据集上)编写查询。

推断
1.如果带有谓词和不带有谓词的扫描节点中的记录数相同-Spark已完全从数据源读取数据,并且将在Spark中进行过滤。
2.如果数字不同,则在数据源连接器中已实现谓词下推。
3.通过该实验,您还可以确定哪些谓词被下推。(取决于连接器的实现)

答案 1 :(得分:0)

尝试.explain。

不确定我是否知道代码,但这是一些有效代码的示例。

val dfX = df.map(row => XYZ{row.getAs[Long]("someVal")}).filter($"someVal" === 2)

但是,假设您可以使代码正常工作,Spark“谓词下推”将适用于您的情况,并在Kudu Storage Manager中进行过滤。因此,并非所有数据都已加载。

这是来自KUDU指南:

  

<>和OR谓词不会被推送到Kudu,而是   由Spark任务评估。只有LIKE谓词带有后缀   通配符被推到Kudu,这意味着LIKE“ FOO%”被下推了   但不是“ FOO%BAR”之类的。

也就是说,您的情况还可以。