将两列传递给scala中的udf?

Roh*_*wal 4 scala user-defined-functions apache-spark

我有一个包含两列的数据框,一列是数据,另一列是该数据字段中的字符数.

Data    Count
Hello   5
How     3
World   5
Run Code Online (Sandbox Code Playgroud)

我想根据count列中的值更改列数据的值.怎么能实现这一目标?我用udf尝试了这个:

invalidrecords.withColumn("value",appendDelimiterError(invalidrecords("value"),invalidrecords("a_cnt")))
Run Code Online (Sandbox Code Playgroud)

这似乎失败了,这是正确的方法吗?

Ram*_*jan 10

这是一种简单的方法

首先你创建一个 dataframe

import sqlContext.implicits._
val invalidrecords = Seq(
  ("Hello", 5),
  ("How", 3),
  ("World", 5)
).toDF("Data", "Count")
Run Code Online (Sandbox Code Playgroud)

你应该有

+-----+-----+
|Data |Count|
+-----+-----+
|Hello|5    |
|How  |3    |
|World|5    |
+-----+-----+
Run Code Online (Sandbox Code Playgroud)

然后将udf函数定义为

import org.apache.spark.sql.functions._
def appendDelimiterError = udf((data: String, count: Int) => "value with error" )
Run Code Online (Sandbox Code Playgroud)

你打电话使用withColumnas

invalidrecords.withColumn("value",appendDelimiterError(invalidrecords("Data"),invalidrecords("Count"))).show(false)
Run Code Online (Sandbox Code Playgroud)

你应该输出为

+-----+-----+----------------+
|Data |Count|value           |
+-----+-----+----------------+
|Hello|5    |value with error|
|How  |3    |value with error|
|World|5    |value with error|
+-----+-----+----------------+
Run Code Online (Sandbox Code Playgroud)

您可以编写逻辑而不是从udf函数返回字符串

编辑

在下面的评论中回答您的要求将要求您更改udf函数和withColumn,如下所示

def appendDelimiterError = udf((data: String, count: Int) => {
  if(count < 5) s"convert value to ${data} - error"
  else data
} )

invalidrecords.withColumn("Data",appendDelimiterError(invalidrecords("Data"),invalidrecords("Count"))).show(false)
Run Code Online (Sandbox Code Playgroud)

你应该有输出

+----------------------------+-----+
|Data                        |Count|
+----------------------------+-----+
|Hello                       |5    |
|convert value to How - error|3    |
|World                       |5    |
+----------------------------+-----+
Run Code Online (Sandbox Code Playgroud)