【问题标题】:PySpark Dataframe identify distinct value on one column based on duplicate values in other columnsPySpark Dataframe 根据其他列中的重复值识别一列上的不同值
【发布时间】:2017-01-09 05:19:44
【问题描述】:

我有一个 pyspark 数据框,例如:其中 c1,c2,c3,c4,c5,c6 是列

   +----------------------------+   
   |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 值。 比如,第 1、第 3 和第 5 行的 c2、c3、c4 和 c5 值相同,但 c1 值不同。所以输出应该是a, c & e
(update) 同样,第 2 行和第 4 行的 c2、c3、c4 和 c5 值相同,但 c1 值不同。所以输出也应该包含 b & d

我怎样才能得到这样的结果?我曾尝试应用 groupby,但我不明白如何获得 c1 的不同值。

更新:

输出应该是 c1 值的 Dataframe

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

我的方法:

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

但我不明白如何检索 m 中的值。我是 pyspark 数据帧的新手,因此非常困惑

【问题讨论】:

  • 您的问题有点难以理解。你能写出输出数据框的例子吗?
  • 谢谢 :) 请检查我的更新
  • 你能用你尝试过的方法更新吗?
  • 这是一种最小化的方法。但是,是的,更新了

标签: python apache-spark dataframe pyspark


【解决方案1】:

这其实很简单,我们先创建一些数据:

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

我希望这能回答你的问题。

【讨论】:

  • 但是如果我有多个这样的重复项,请在所需的输出中检查我的编辑问题
  • 我相信你应该问一个后续问题而不是编辑。否则会一团糟。
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多