在 spark scala 中为 withcolumn 编写通用函数
Posted
技术标签:
【中文标题】在 spark scala 中为 withcolumn 编写通用函数【英文标题】:Writting generic function for withcolumn in spark scala 【发布时间】:2020-07-27 04:00:57 【问题描述】:我正在使用以下 withcolumn 条件创建一个新的数据帧 df。我对其他数据帧也有以下 withcolumn 条件的相同用法。如何将这些所有 withcolumn 条件编写为通用函数并在所有数据帧中访问它。
val df = sampledf.withColumn("concat", concat($"columna", $"columnb", $"columnc"))
.withColumn("sub", $"columna" - $"columnb")
.withColumn("div", $"columna" / $"columnb")
.withColumn("mul", $"columna" * $"columnb")
【问题讨论】:
创建一个泛型函数也需要你传递所有的参数,所以为什么不使用 withColumn 本身呢。 【参考方案1】:这是一个可重用的函数:
def yourFunction()(df: DataFrame) =
df.withColumn("concat", concat($"columna", $"columnb", $"columnc"))
.withColumn("sub", $"columna" - $"columnb")
.withColumn("div", $"columna" / $"columnb")
.withColumn("mul", $"columna" * $"columnb")
以下是如何使用该功能:
val df = sampledf.transform(yourFunction())
有关使用 Spark 链接 DataFrame 转换的更多信息,请参阅 this post。编写干净的 Spark 代码是一种非常重要的设计模式。
【讨论】:
很好的答案! +1,您能否分享有关 spark scala 中所有设计模式的信息链接,这对我未来的工作非常有用。 很高兴看到如何执行这样的功能:)【参考方案2】:使用higher order functions
。
检查下面的代码。
定义通用函数。
scala> def func(
f: (Column,Column) => Column,
cols:Column*
): Column = cols.reduce(f)
示例数据帧
scala> df.show(false)
+-------+-------+-------+
|columna|columnb|columnc|
+-------+-------+-------+
|1 |2 |3 |
+-------+-------+-------+
创建表达式。
scala> val colExpr = Seq(
| $"columna",
| $"columnb",
| $"columnc",
| func(concat(_,_),$"columna",$"columnb",$"columnc").as("concat"),
| func((_ / _),$"columna",$"columnb").as("div"),
| func((_ * _),$"columna",$"columnb").as("mul"),
| func((_ + _),$"columna",$"columnb").as("add"),
| func((_ - _),$"columna",$"columnb").as("sub")
| )
应用表达式。
scala> df.select(colExpr:_*).show(false)
+-------+-------+-------+------+---+---+---+---+
|columna|columnb|columnc|concat|div|mul|add|sub|
+-------+-------+-------+------+---+---+---+---+
|1 |2 |3 |123 |0.5|2 |3 |-1 |
+-------+-------+-------+------+---+---+---+---+
查看post了解更多详情。
【讨论】:
以上是关于在 spark scala 中为 withcolumn 编写通用函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件
在 spark scala 中为数据帧中的每个组采样不同数量的随机行