有时你可能需要执行多个转换DataFrame:
% scala org.apache.spark.sql.functions进口。_进口org.apache.spark.sql。DataFrameval testDf = (1 to 10).toDF("col") def func0(x: Int => Int, y: Int)(in: DataFrame): DataFrame = { in.filter('col > x(y)) } def func1(x: Int)(in: DataFrame): DataFrame = { in.selectExpr("col", s"col + $x as col1") } def func2(add: Int)(in: DataFrame): DataFrame = { in.withColumn("col2", expr(s"col1 + $add")) }
当你应用这些转换,你可能最终得到意大利面条式代码是这样的:
% scala def . n:行情)(我:Int) = i + 1 val tmp0 = func0(公司,3)(testDf) val tmp1 = func1 (1) (tmp0) val tmp2 = func2 (2) (tmp1) val res = tmp2。withColumn (col3 expr (“col2 + 3”))
本文描述了几种方法来简化链接转换。
DataFrame变换API
在火花受益于函数式编程风格,您可以利用DataFrame变换API,例如:
% scala val res = testDf。变换(func0(inc, 4)) .transform(func1(1)) .transform(func2(2)) .withColumn("col3", expr("col2 + 3"))
Function.chainAPI
更进一步,您可以利用Scala函数库,链的转换,例如:
% scala val链接=函数。链(List(func0(inc, 4)(_), func1(1)(_), func2(2)(_))) val res = testDf.transform(chained) .withColumn("col3", expr("col2 + 3"))
隐式的类
另一个替代方法是定义一个Scala隐式的类,它允许您消除DataFrame变换API:
% scala隐式类MyTransforms (df: DataFrame) {def func0 (Int x: = > Int y: Int): DataFrame = {df。过滤器(' > x (y))} def func1上校(x: Int): DataFrame = {df。selectExpr(“上校”,“像col1坳+ $ x”)} def func2(添加:Int): DataFrame = {df。withColumn (“col2 expr (s“col1 +添加美元”)}}
然后你就可以直接调用的函数:
% scala val res = testDf。func0(公司,1).func1 (2) .func2 (3) .withColumn (col3, expr (“col2 + 3”))