加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

将两列传递给scala中的udf?

发布时间:2020-12-16 10:06:16 所属栏目:安全 来源:网络整理
导读:我有一个包含两列的数据框,一列是数据,另一列是 ?该数据字段中的字符数. Data CountHello 5How 3World 5 我想根据count列中的值更改列数据的值.怎么能实现这一目标?我用udf尝试了这个: invalidrecords.withColumn("value",appendDelimiterError(invalidrec
我有一个包含两列的数据框,一列是数据,另一列是
?该数据字段中的字符数.

Data    Count
Hello   5
How     3
World   5

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

invalidrecords.withColumn("value",appendDelimiterError(invalidrecords("value"),invalidrecords("a_cnt")))

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

解决方法

这是一种简单的方法

首先,您创建一个数据框

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

你应该有

+-----+-----+
|Data |Count|
+-----+-----+
|Hello|5    |
|How  |3    |
|World|5    |
+-----+-----+

然后将udf函数定义为

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

你打电话使用withColumn作为

invalidrecords.withColumn("value",appendDelimiterError(invalidrecords("Data"),invalidrecords("Count"))).show(false)

你应该输出为

+-----+-----+----------------+
|Data |Count|value           |
+-----+-----+----------------+
|Hello|5    |value with error|
|How  |3    |value with error|
|World|5    |value with error|
+-----+-----+----------------+

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

编辑

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

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

invalidrecords.withColumn("Data",invalidrecords("Count"))).show(false)

你应该有输出

+----------------------------+-----+
|Data                        |Count|
+----------------------------+-----+
|Hello                       |5    |
|convert value to How - error|3    |
|World                       |5    |
+----------------------------+-----+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读