【发布时间】:2018-05-23 16:49:50
【问题描述】:
我正在尝试自学 Scala,同时尝试编写函数式语言的惯用代码,即编写更好、更优雅的函数式代码。
我有以下代码可以正常工作:
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
import java.time.LocalDate
object DataFrameExtensions_ {
implicit class DataFrameExtensions(df: DataFrame){
def featuresGroup1(groupBy: Seq[String], asAt: LocalDate): DataFrame = {df}
def featuresGroup2(groupBy: Seq[String], asAt: LocalDate): DataFrame = {df}
}
}
import DataFrameExtensions_._
val spark = SparkSession.builder().config(new SparkConf().setMaster("local[*]")).enableHiveSupport().getOrCreate()
import spark.implicits._
val df = Seq((8, "bat"),(64, "mouse"),(-27, "horse")).toDF("number", "word")
val groupBy = Seq("a","b")
val asAt = LocalDate.now()
val dataFrames = Seq(df.featuresGroup1(groupBy, asAt),df.featuresGroup2(groupBy, asAt))
最后一行让我很困扰。这两个函数(featuresGroup1、featuresGroup2)都具有相同的签名:
scala> :type df.featuresGroup1(_,_)
(Seq[String], java.time.LocalDate) => org.apache.spark.sql.DataFrame
scala> :type df.featuresGroup2(_,_)
(Seq[String], java.time.LocalDate) => org.apache.spark.sql.DataFrame
并采用相同的vals 作为参数,所以我假设我可以以更实用的方式编写该行(可能以某种方式使用.map),这意味着我可以只编写一次参数列表并将其传递给两个函数.我无法弄清楚语法。我想也许我可以构建一个这些函数的列表,但这不起作用:
scala> Seq(featuresGroup1, featuresGroup2)
<console>:23: error: not found: value featuresGroup1
Seq(featuresGroup1, featuresGroup2)
^
<console>:23: error: not found: value featuresGroup2
Seq(featuresGroup1, featuresGroup2)
^
谁能帮忙?
【问题讨论】:
标签: scala