我是新来的火花。以下代码将加载所有数据还是仅过滤来自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
})
答案 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”之类的。
也就是说,您的情况还可以。