我有一个包含两列的数据框,一列是数据,另一列是 该数据字段中的字符数。
Data Count
Hello 5
How 3
World 5
我想根据count列中的值更改列数据的值。怎么能实现这一目标?我用udf尝试了这个:
invalidrecords.withColumn("value",appendDelimiterError(invalidrecords("value"),invalidrecords("a_cnt")))
这似乎失败了,这是正确的方法吗?
答案 0 :(得分:9)
这是一种简单的方法
首先创建一个dataframe
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",appendDelimiterError(invalidrecords("Data"),invalidrecords("Count"))).show(false)
你应该输出
+----------------------------+-----+
|Data |Count|
+----------------------------+-----+
|Hello |5 |
|convert value to How - error|3 |
|World |5 |
+----------------------------+-----+