【发布时间】:2019-01-30 22:21:13
【问题描述】:
如何在 Scala 中获得高阶函数以正确接受火花过滤器谓词? IE。
val df = Seq(1,2,3,4).toDF("value")
df.filter(col("value")> 2).show
df.filter(col("value")< 2).show
工作得很好。但是当我尝试将其重构为一个接受过滤谓词的函数时(注意:与> 运算符相同的签名),编译器不再找到要提交给谓词的左/右部分。
def myFilter =(predicate:Any =>Column)(df:DataFrame)= {
df.filter(col("value") predicate 2).show // WARN this does not compile
}
df.transform(myFilter(>)).show
如何让它发挥作用?
【问题讨论】:
-
在 Scala 中
a x b表示a.x(b),所以col("value") predicate 2表示col("value").predicate(2)这不是你想要的。也许更像predicate(col("value"), 2)? -
不,这还不够。
df.filter(col("value").predicate(2))也不起作用。 -
您需要将其更改为
predicate(col("value"), 2)。您还需要更改predicate的签名。我对 Spark 的了解不够,无法给出完整的答案(这就是我使用 cmets 的原因),但它应该类似于(Column, Int) => Boolean。然后你将_ > _而不仅仅是>传递给myFilter。
标签: scala apache-spark apache-spark-sql