需要帮助来比较spark scala中的两列

时间:2017-07-10 11:20:30

标签: scala apache-spark

我有像这样的火花数据框

id1 id2 attrname attr_value attr_valuelist
1    2  test         Yes      Yes, No
2    1  test1        No       Yes, No
3    2  test2       value1    val1, Value1,value2
4    1  test3         3        0, 1, 2
5    3  test4         0        0, 1, 2
11   2  test         Yes      Yes, No
22   1  test1        No1       Yes, No
33   2  test2       value0    val1, Value1,value2
44   1  test3         11        0, 1, 2
55   3  test4         0        0, 1, 2

val df = sqlContext.sql("select id1, id2, attrname, attr_value, attr_valuelist from dftable)

我想检查attr_valuelist中的attr_value,如果它不存在那么只接受那些行

id1 id2 attrname attr_value attr_valuelist
4    1  test3         3        0, 1, 2
22   1  test1        No1       Yes, No
33   2  test2       value0    val1, Value1,value2
44   1  test3         11        0, 1, 2

2 个答案:

答案 0 :(得分:2)

您只需在数据框中使用contains执行以下操作

即可
import org.apache.spark.sql.functions._
df.filter(!(col("attr_valuelist").contains(col("attr_value")))).show(false)

你应该有以下输出

+---+---+--------+----------+-------------------+
|id1|id2|attrname|attr_value|attr_valuelist     |
+---+---+--------+----------+-------------------+
|3  |2  |test2   |value1    |val1, Value1,value2|
|4  |1  |test3   |3         |0, 1, 2            |
|22 |1  |test1   |No1       |Yes, No            |
|33 |2  |test2   |value0    |val1, Value1,value2|
|44 |1  |test3   |11        |0, 1, 2            |
+---+---+--------+----------+-------------------+

如果您想忽略大小写字母,那么您只需将用户lower视为

df.filter(!(lower(col("attr_valuelist")).contains(lower(col("attr_value"))))).show(false)
你应该

+---+---+--------+----------+-------------------+
|id1|id2|attrname|attr_value|attr_valuelist     |
+---+---+--------+----------+-------------------+
|4  |1  |test3   |3         |0, 1, 2            |
|22 |1  |test1   |No1       |Yes, No            |
|33 |2  |test2   |value0    |val1, Value1,value2|
|44 |1  |test3   |11        |0, 1, 2            |
+---+---+--------+----------+-------------------+

答案 1 :(得分:1)

您可以在Spark中定义自定义函数,用户定义函数,您可以在其中测试列中的值是否包含在另一列的值中,如下所示:

def contains = udf((attr: String, attrList: String) => attrList.contains(attr))
def notContains = udf((attr: String, attrList: String) => !attrList.contains(attr))

你可以调整包含你想要的功能,然后你可以从你的数据框中选择这样的

df.where(contains(df("attr_value", df("attr_valuelist")))
df.where(notContains(df("attr_value", df("attr_valuelist")))