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