2017-07-10 29 views
1

我有火花數據幀這樣需要幫助兩列火花階比較

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 

回答

1

你可以簡單地做了與包含在數據幀以下

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   | 
+---+---+--------+----------+-------------------+ 
+0

感謝拉梅什, 但我看到上面的例子也會選擇列,如果我有這樣的 ID1值| ID2 | attrname | attr_value | attr_valuelist --------------------------------------------- -------------- 44 | 1 | test3 | 1 | 10,11,12 attr_valuelist不是數組,它是字符串 –

+0

你測試了嗎?我添加了上面的行,並將其過濾掉。我將attr_valuelist視爲一個字符串,不像數組。 –

+0

對不起,我正在測試通過SQL,所以它來了,因爲我也沒有得到它。非常感謝你。我無法點擊接受答案。我會在一段時間內完成。 –

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")))