gpt4 book ai didi

python - 如何使用 pyspark collect_list 函数检索所有列

转载 作者:行者123 更新时间:2023-11-28 21:03:10 24 4
gpt4 key购买 nike

我有一个 pyspark 2.0.1。我正在尝试对我的数据框进行分组并从我的数据框中检索所有字段的值。我发现

z=data1.groupby('country').agg(F.collect_list('names')) 

将为我提供国家和名称属性的值以及名称属性的值,它将为列标题提供 collect_list(names)。但是对于我的工作,我有大约 15 列的数据框&我将运行一个循环&每次在循环内更改 groupby 字段&需要所有剩余字段的输出。你能建议我如何使用 collect_list( ) 或任何其他 pyspark 函数?

我也试过这段代码

from pyspark.sql import functions as F 
fieldnames=data1.schema.names
names1= list()
for item in names:
if item != 'names':
names1.append(item)
z=data1.groupby('names').agg(F.collect_list(names1))
z.show()

但收到错误信息

Py4JError: An error occurred while calling z:org.apache.spark.sql.functions.collect_list. Trace: py4j.Py4JException: Method collect_list([class java.util.ArrayList]) does not exist 

最佳答案

在调用groupBy之前使用struct组合列

假设你有一个数据框

df = spark.createDataFrame(sc.parallelize([(0,1,2),(0,4,5),(1,7,8),(1,8,7)])).toDF("a","b","c")

df = df.select("a", f.struct(["b","c"]).alias("newcol"))
df.show()
+---+------+
| a|newcol|
+---+------+
| 0| [1,2]|
| 0| [4,5]|
| 1| [7,8]|
| 1| [8,7]|
+---+------+
df = df.groupBy("a").agg(f.collect_list("newcol").alias("collected_col"))
df.show()
+---+--------------+
| a| collected_col|
+---+--------------+
| 0|[[1,2], [4,5]]|
| 1|[[7,8], [8,7]]|
+---+--------------+

聚合操作只能在单个列上完成。

聚合后,您可以收集结果并对其进行迭代以分离组合列生成索引字典。或者你可以写一个udf 来分隔合并的列。

from pyspark.sql.types import *
def foo(x):
x1 = [y[0] for y in x]
x2 = [y[1] for y in x]
return(x1,x2)

st = StructType([StructField("b", ArrayType(LongType())), StructField("c", ArrayType(LongType()))])
udf_foo = udf(foo, st)
df = df.withColumn("ncol",
udf_foo("collected_col")).select("a",
col("ncol").getItem("b").alias("b"),
col("ncol").getItem("c").alias("c"))
df.show()

+---+------+------+
| a| b| c|
+---+------+------+
| 0|[1, 4]|[2, 5]|
| 1|[7, 8]|[8, 7]|
+---+------+------+

关于python - 如何使用 pyspark collect_list 函数检索所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com