我正在尝试创建一个函数列表,以便将其映射到DataFrame,但即使在搜索之后,我也无法弄清楚如何将完全限定的函数名称传递到列表中。即使我已经编译了,我也很确定math.min
和math.max
不是我想要的,因为我实际执行的函数来自org.apache.spark.sql.functions._
进口。
如何从特定导入创建函数列表?
import org.apache.spark.sql.functions._
// This works - map each function over the DF columns
df.select(df.columns.map(mean): _*).show
df.select(df.columns.map(max): _*).show
df.select(df.columns.map(min): _*).show
val functions = Array(math.min _, math.max _) // this isn't throwing errors
/*****************************************************************************/
// These attempts to create function lists don't work
val functions = Array(org.apache.spark.sql.functions.mean _, math.min _, math.max _) // won't compile
val functions = Array(_ => org.apache.spark.sql.functions.mean(_), math.min _, math.max _) // doesn't work
// apply each function to the columns and then combine into one dataframe
functions.map(f => df.select(numeric_df.columns.map(f): _*)).reduce(_ union _).show
答案 0 :(得分:2)
如果要创建包含常量a
,b
,...,z
的列表,那么
这样的事情:
import org.apache.spark.sql.functions.{mean, min, max}
val functions: Array[String => Column] =
Array(mean(_: String), min(_: String), max(_: String))
eta扩展中的显式类型注释是必要的,因为方法mean
,min
,max
被重载(同时有mean(colName: String)
和mean(c: Column)
)
这些函数当然与math.max
等无关,这些是可以应用于列的spark-sql函数。