在 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中为两个不同的数据框创建视图

如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件

在 spark scala 中为数据帧中的每个组采样不同数量的随机行

我可以在 build.sbt 中为 spark 3 和 scala 2.12 获取 neo4j 的命令(依赖项)吗?

在 Spark 中为可变集合建模

如何在 Spark 中创建一组 ngram?