简化链接转换

学习如何简化链接转换你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”))


这篇文章有用吗?