我正在使用Spark处理Scala,我有一个包含两列文本的数据框。
这些列的格式为“term1,term2,term3,...”,我想创建第三列,其中包含两个列的常用术语。
例如
Col1
orange, apple, melon
party, clouds, beach
Col2
apple, apricot, watermelon
black, yellow, white
结果将是
Col3
1
0
到目前为止我所做的是创建一个分割文本并获得两列交集的udf。
val common_terms = udf((a: String, b: String) => if (a.isEmpty || b.isEmpty) {
0
} else {
split(a, ",").intersect(split(b, ",")).length
})
然后在我的数据框架上
val results = termsDF.withColumn("col3", common_terms(col("col1"), col("col2"))
但是我有以下错误
Error:(96, 13) type mismatch;
found : String
required: org.apache.spark.sql.Column
split(a, ",").intersect(split(b, ",")).length
编辑:
val common_authors = udf((a: String, b: String) => if (a != null || b != null) {
0
} else {
val tempA = a.split( ",")
val tempB = b.split(",")
if ( tempA.isEmpty || tempB.isEmpty ) {
0
} else {
tempA.intersect(tempB).length
}
})
编辑后,如果我尝试termsDF.show()运行。但是,如果我做那样的事情,termsDF.orderBy(desc("col3"))那么我会得到一个java.lang.NullPointerException
尝试
val common_terms = udf((a: String, b: String) => if (a.isEmpty || b.isEmpty) {
0
} else {
var tmp1 = a.split(",")
var tmp2 = b.split(",")
tmp1.intersect(tmp2).length
})
val results = termsDF.withColumn("col3", common_terms($"a", $"b")).show
split(a,“,”)它的一个spark column功能。你正在使用一个udf所以你需要使用string.split()这是一个scala函数
编辑后:将空验证更改为== not!=
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。