簡化鏈接轉換

在Databricks中了解如何簡化DataFrame上的鏈式轉換。

寫的亞當Pavlacka

最後發布時間:2022年5月25日

有時候你可能需要在你的數據幀上執行多個轉換:

% 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"))