有時候你可能需要在你的數據幀上執行多個轉換:
% scala org.apache.spark.sql.functions進口。_ import org.apache.spark.sql.DataFrame val testDf =(1到10). todf ("col") def func0(x: Int => Int, y: Int)(in: DataFrame): DataFrame = {in. todf ("col")filter('col > x(y))} def func1(x: Int)(in: DataFrame): DataFrame = {in. filter('col > x(y))}selectExpr("col", s"col + $x as col1")} def func2(add: Int)(in: DataFrame): DataFrame = {in。withColumn("col2", expr(s"col1 + $add"))}
當你應用這些轉換時,你可能會得到如下的意大利麵條代碼:
%scala def inc(i: Int) = i + 1 val tmp0 = func0(inc, 3)(testDf) val tmp1 = func1(1)(tmp0) val tmp2 = func2(2)(tmp1) val res = tmp2。withColumn("col3", expr("col2 + 3"))
本文描述了簡化鏈式轉換的幾種方法。
DataFrame變換API
要從Spark中的函數式編程風格中受益,可以利用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 chained =函數。鏈(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(x: Int => Int, y: Int): DataFrame = {df。filter('col > x(y))} def func1(x: Int): DataFrame = {df. filter('col > x(y))}selectExpr("col", s"col + $x as col1")} def func2(add: Int): DataFrame = {df.}withColumn("col2", expr(s"col1 + $add"))}}
然後你可以直接調用函數:
%scala val res = testDf。func0(inc, 1) .func1(2) .func2(3) .withColumn("col3", expr("col2 + 3"))