【问题标题】:spark filter with higher order function具有高阶函数的火花过滤器
【发布时间】: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

工作得很好。但是当我尝试将其重构为一个接受过滤谓词的函数时(注意:与&gt; 运算符相同的签名),编译器不再找到要提交给谓词的左/右部分。

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) =&gt; Boolean。然后你将_ &gt; _ 而不仅仅是&gt; 传递给myFilter

标签: scala apache-spark apache-spark-sql


【解决方案1】:

结合不同的 cmets 给出了一个可能的解决方案:

def myFilter = (predicate: (Column, Int) => Column)(df: DataFrame) = {
  df.filter(predicate(col("value"), 2))
}

df.transform(myFilter(_ > _)).show

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2018-12-17
    • 2018-03-07
    相关资源
    最近更新 更多