2016-09-01 108 views
1

我有一個pyspark數據幀重複的值不同的值,如:其中C1,C2,C3,C4,C5,C6是列PySpark數據幀上的一列識別基於在其他列

+----------------------------+ 
    |c1 | c2 | c3 | c4 | c5 | c6 | 
    |----------------------------| 
    | a | x | y | z | g | h |  
    | b | m | f | l | n | o |  
    | c | x | y | z | g | h |  
    | d | m | f | l | n | o |  
    | e | x | y | z | g | i | 
    +----------------------------+ 

我想爲具有相同c2,c3,c4,c5值但不同c1值的行提取c1值。 Like,1st,3rd &第5行對於c2,c3,c4 & c5具有相同的值,但具有不同的c1值。所以輸出應該是a,c & e
(更新) 類似地,第二行&第4行對於c2,c3,c4具有相同的值c0但是不同的c1值。所以輸出還應該包含b & d

我該如何獲得這樣的結果?我試過應用groupby,但我不明白如何獲取c1的不同值。

UPDATE:

輸出應的數據幀C1值

# +-------+ 
# |c1_dups| 
# +-------+ 
# | a,c,e| 
# | b,e| 
# +-------+ 

我的方法:

m = data.groupBy('c2','c3','c4','c5) 

,但我不理解如何檢索值在米。我是新來pyspark dataframes因此很困惑

+0

理解你的問題有點難。你能寫出輸出數據框的例子嗎? –

+0

謝謝:)請檢查我的更新 – Denver

+0

您可以通過您嘗試的方法更新組? – eliasah

回答

4

這其實很簡單,讓我們先創建一些數據:

schema = ['c1','c2','c3','c4','c5','c6'] 

rdd = sc.parallelize(["a,x,y,z,g,h","b,x,y,z,l,h","c,x,y,z,g,h","d,x,f,y,g,i","e,x,y,z,g,i"]) \ 
     .map(lambda x : x.split(",")) 

df = sqlContext.createDataFrame(rdd,schema) 
# +---+---+---+---+---+---+ 
# | c1| c2| c3| c4| c5| c6| 
# +---+---+---+---+---+---+ 
# | a| x| y| z| g| h| 
# | b| x| y| z| l| h| 
# | c| x| y| z| g| h| 
# | d| x| f| y| g| i| 
# | e| x| y| z| g| i| 
# +---+---+---+---+---+---+ 

現在最有趣的部分,你只需要導入一些功能,組通過和爆炸如下:

from pyspark.sql.functions import * 

dupes = df.groupBy('c2','c3','c4','c5') \ 
      .agg(collect_list('c1').alias("c1s"),count('c1').alias("count")) \ # we collect as list and count at the same time 
      .filter(col('count') > 1) # we filter dupes 

df2 = dupes.select(explode("c1s").alias("c1_dups")) 

df2.show() 
# +-------+ 
# |c1_dups| 
# +-------+ 
# |  a| 
# |  c| 
# |  e| 
# +-------+ 

我希望這可以回答你的問題。

+0

非常感謝你! – Denver

+0

但是如果我有多個這樣的重複項,請檢查問題以獲取我想要的輸出中的編輯 – Denver

+0

我相信您應該詢問後續問題而不是編輯。否則將會是一團糟。 – eliasah