Den*_*ver 2 python dataframe apache-spark pyspark
我有一个像这样的pyspark数据框:其中c1,c2,c3,c4,c5,c6是列
Run Code Online (Sandbox Code Playgroud)+----------------------------+ |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.
(更新)
类似地,第2行和第4行对于c2,c3,c4和c5具有相同的值但是具有不同的c1值.所以输出也应该包含b&d
我怎样才能获得这样的结果?我尝试过应用groupby,但我不明白如何获取c1的不同值.
更新:
输出应该是c1值的数据帧
# +-------+
# |c1_dups|
# +-------+
# | a,c,e|
# | b,e|
# +-------+
Run Code Online (Sandbox Code Playgroud)
我的方法:
m = data.groupBy('c2','c3','c4','c5)
Run Code Online (Sandbox Code Playgroud)
但我不明白如何检索m中的值.我是pyspark数据帧的新手,因此非常困惑
这实际上非常简单,让我们先创建一些数据:
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|
# +---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)
现在是有趣的部分,你只需要导入一些函数,分组并爆炸如下:
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|
# +-------+
Run Code Online (Sandbox Code Playgroud)
我希望这回答了你的问题.