Pyspark # |2 |[2, 3] | # +-----+------------------+
编辑:如果您希望保留一些列以供骑乘,并且它们不需要聚合,您可以将它们包含在Pyspark # |2 |[2, 3] | # +-----+------------------+,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,编辑:如果您希望保留一些列以供骑乘,并且它们不需要聚合,您可以将它们包含在groupBy中,或者在聚合后重新加入它们(下面的示例)。如果它们确实需要聚合,只需按'store'分组,只需在'other'列/s上将所需的聚合函数添加到.agg()调用中即可 从pyspark.sql导入函数为F df=sc.parallelize([(1[1,2,3],'a'),(1[4,5,6],'a'),(2[2],'b'),(2[3],'b')))。toDF(['store','values','other']
groupBy
中,或者在聚合后重新加入它们(下面的示例)。如果它们确实需要聚合,只需按'store'
分组,只需在'other'
列/s上将所需的聚合函数添加到.agg()
调用中即可
从pyspark.sql导入函数为F
df=sc.parallelize([(1[1,2,3],'a'),(1[4,5,6],'a'),(2[2],'b'),(2[3],'b')))。toDF(['store','values','other']))
# +-----+---------+-----+
#|存储|值|其他|
# +-----+---------+-----+
#| 1 |[1,2,3]| a|
#| 1 |[4,5,6]| a|
#| 2 |[2]| b|
#| 2 |[3]| b|
# +-----+---------+-----+
df2=df.withColumn('values',F.explode('values'))
# +-----+------+-----+
#|存储|值|其他|
# +-----+------+-----+
#| 1 | 1 | a|
#| 1 | 2 | a|
#| 1 | 3 | a|
#| 1 | 4 | a|
#| 1 | 5 | a|
#| 1 | 6 | a|
#| 2 | 2 | b|
#| 2 | 3 | b|
# +-----+------+-----+
df3=df2.groupBy('store','other').agg(F.collect_list('values')。别名('values'))
# +-----+-----+------------------+
#|存储|其他|值|
# +-----+-----+------------------+
#| 1 | a |[1,2,3,4,5,6]|
#| 2 | b |[2,3]|
# +-----+-----+------------------+
df4=(
df.drop('值')
.加入(
df2.groupBy('store')
.agg(F.collect_list('values')。别名('values')),
on=['store'],how='inner'
)
.drop_duplicates()
)
# +-----+-----+------------------+
#|存储|其他|值|
# +-----+-----+------------------+
#| 1 | a |[1,2,3,4,5,6]|
#| 2 | b |[2,3]|
# +-----+-----+------------------+
自PySpark 2.4以来,您可以使用以下代码:
df = df.groupBy("store").agg(collect_list("values").alias("values"))
df = df.select("store", array_sort(array_distinct(expr("reduce(values, array(), (x,y) -> concat(x, y))"))).alias("values"))
现在,可以使用展平功能,事情变得简单多了。 您只需在groupby之后展平收集的数组
# 1. Create the DF
df = sc.parallelize([(1, [1, 2, 3]), (1, [4, 5, 6]) , (2,[2]),(2,[3])]).toDF(["store","values"])
+-----+---------+
|store| values|
+-----+---------+
| 1|[1, 2, 3]|
| 1|[4, 5, 6]|
| 2| [2]|
| 2| [3]|
+-----+---------+
# 2. Group by store
df = df.groupBy("store").agg(F.collect_list("values"))
+-----+--------------------+
|store|collect_list(values)|
+-----+--------------------+
| 1|[[1, 2, 3], [4, 5...|
| 2| [[2], [3]]|
+-----+--------------------+
# 3. finally.... flat the array
df = df.withColumn("flatten_array", F.flatten("collect_list(values)"))
+-----+--------------------+------------------+
|store|collect_list(values)| flatten_array|
+-----+--------------------+------------------+
| 1|[[1, 2, 3], [4, 5...|[1, 2, 3, 4, 5, 6]|
| 2| [[2], [3]]| [2, 3]|
+-----+--------------------+------------------+
试图编辑新问题的答案不仅不同寻常,而且无可否认,这是前所未闻的!请打开一个新问题,如有必要,请链接此处…抱歉!我是新手,不用担心,没有伤害。如果您打开一个新窗口,请在此处包含一个链接question@desertnaut我发布了一个新问题Spark现在支持
flant
功能。请参阅Hululu的答案如何删除重复项pyspark/spark 2.4上的示例失败,错误为NameError:name“reduce”未定义。你知道为什么吗?@AlexOrtner这是python3的问题,而不是Spark的问题;请查看更新如何使用此方法保留其他列?您可以将它们与存储
一起添加到groupBy函数中,或者您可以将最终结果与存储
列上的初始输入数据框连接起来。谢谢!我最后把它们添加到了groupby中。很好。只是补充一下。所有这些都可以通过df.groupBy(“store”).agg(F.flant(F.collect_list(“value”))
from pyspark.sql import functions as F
df.groupBy("store").agg(F.collect_list("values"))
+-----+----------------------------------------------+
|store|collect_list(values) |
+-----+----------------------------------------------+
|1 |[WrappedArray(1, 2, 3), WrappedArray(4, 5, 6)]|
|2 |[WrappedArray(2), WrappedArray(3)] |
+-----+----------------------------------------------+
>>> df = sc.parallelize([(1, [1, 2, 3]), (1, [4, 5, 6]) , (2,[2]),(2,[3])]).toDF(["store", "values"])
>>> df.show()
+-----+---------+
|store| values|
+-----+---------+
| 1|[1, 2, 3]|
| 1|[4, 5, 6]|
| 2| [2]|
| 2| [3]|
+-----+---------+
>>> df.rdd.map(lambda r: (r.store, r.values)).reduceByKey(lambda x,y: x + y).toDF(['store','values']).show()
+-----+------------------+
|store| values|
+-----+------------------+
| 1|[1, 2, 3, 4, 5, 6]|
| 2| [2, 3]|
+-----+------------------+
df = df.groupBy("store").agg(collect_list("values").alias("values"))
df = df.select("store", array_sort(array_distinct(expr("reduce(values, array(), (x,y) -> concat(x, y))"))).alias("values"))
# 1. Create the DF
df = sc.parallelize([(1, [1, 2, 3]), (1, [4, 5, 6]) , (2,[2]),(2,[3])]).toDF(["store","values"])
+-----+---------+
|store| values|
+-----+---------+
| 1|[1, 2, 3]|
| 1|[4, 5, 6]|
| 2| [2]|
| 2| [3]|
+-----+---------+
# 2. Group by store
df = df.groupBy("store").agg(F.collect_list("values"))
+-----+--------------------+
|store|collect_list(values)|
+-----+--------------------+
| 1|[[1, 2, 3], [4, 5...|
| 2| [[2], [3]]|
+-----+--------------------+
# 3. finally.... flat the array
df = df.withColumn("flatten_array", F.flatten("collect_list(values)"))
+-----+--------------------+------------------+
|store|collect_list(values)| flatten_array|
+-----+--------------------+------------------+
| 1|[[1, 2, 3], [4, 5...|[1, 2, 3, 4, 5, 6]|
| 2| [[2], [3]]| [2, 3]|
+-----+--------------------+------------------+