我有一个简单的代码:
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
,我不知道这是怎么回事。
答案 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]): T和reduce(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
希望,这会有所帮助!