Dataset.reduce不支持速记功能

时间:2018-07-12 02:50:30

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

我有一个简单的代码:

test("0153") {
  val c = Seq(1,8,4,2,7)
  val max = (x:Int, y:Int)=> if (x > y) x else y
  c.reduce(max)
}

工作正常。但是,当我以相同的方式使用Dataset.reduce时,

test("SparkSQLTest") {
  def max(x: Int, y: Int) = if (x > y) x else y
  val spark = SparkSession.builder().master("local").appName("SparkSQLTest").enableHiveSupport().getOrCreate()
  val ds = spark.range(1, 100).map(_.toInt)
  ds.reduce(max) //compiling error:Error:(20, 15) missing argument list for method max
}

编译器抱怨missing argument list for method max,我不知道这是怎么回事。

2 个答案:

答案 0 :(得分:2)

更改为函数而不是方法,它应该可以工作,即代替

def max(x: Int, y: Int) = if (x > y) x else y

使用

val max = (x: Int, y: Int) => if (x > y) x else y

使用功能,使用ds.reduce(max)应该可以直接使用。有关差异的更多信息,请参见here


否则,正如hadooper指出的那样,您可以通过提供参数来使用该方法,

def max(x: Int, y: Int) = if (x > y) x else y
ds.reduce((x, y) => max(x,y))

答案 1 :(得分:1)

根据spark scala文档,reduce函数签名为reduce(func: ReduceFunction[T]): Treduce(func: (T, T) ⇒ T): T,因此以下任一方法都可以

方法1:

scala> val ds = spark.range(1, 100).map(_.toInt)
ds: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> def max(x: Int, y: Int) = if (x > y) x else y
max: (x: Int, y: Int)Int

scala> ds.reduce((x, y) => max(x,y))
res1: Int = 99

方法2 [如果您坚持使用诸如reduce(max)之类的简写形式:

scala> val ds = spark.range(1, 100).map(_.toInt)
ds: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> object max extends org.apache.spark.api.java.function.ReduceFunction[Int]{
     | def call(x:Int, y:Int) = {if (x > y) x else y}
     | }
defined object max

scala> ds.reduce(max)
res3: Int = 99

希望,这会有所帮助!