簡化鏈接轉換

學習如何簡化鏈接轉換你DataFrame磚。

寫的亞當Pavlacka

去年發表在:2022年5月25日

有時你可能需要執行多個轉換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”))