我想知道是否有某种方法可以为多列上的spark数据帧指定自定义聚合函数.
我有一个类似这样的表(名称,项目,价格):
john | tomato | 1.99
john | carrot | 0.45
bill | apple | 0.99
john | banana | 1.29
bill | taco | 2.59
Run Code Online (Sandbox Code Playgroud)
至:
我想将每个人的项目和成本汇总到这样的列表中:
john | (tomato, 1.99), (carrot, 0.45), (banana, 1.29)
bill | (apple, 0.99), (taco, 2.59)
Run Code Online (Sandbox Code Playgroud)
这在数据帧中是否可行?我最近了解到collect_list它,但它似乎只适用于一个专栏.
我有DataFrame3列,即Id, First Name, Last Name
我想申请GroupBy的基础上,Id并希望收集First Name, Last Name列作为列表.
示例: - 我有这样的DF
+---+-------+--------+
|id |fName |lName |
+---+-------+--------+
|1 |Akash |Sethi |
|2 |Kunal |Kapoor |
|3 |Rishabh|Verma |
|2 |Sonu |Mehrotra|
+---+-------+--------+
Run Code Online (Sandbox Code Playgroud)
我希望我的输出像这样
+---+-------+--------+--------------------+
|id |fname |lName |
+---+-------+--------+--------------------+
|1 |[Akash] |[Sethi] |
|2 |[Kunal, Sonu] |[Kapoor, Mehrotra] |
|3 |[Rishabh] |[Verma] |
+---+-------+--------+--------------------+
Run Code Online (Sandbox Code Playgroud)
提前致谢
我有一个pyspark 2.0.1。我正在尝试对数据框进行分组并从我的数据框中检索所有字段的值。我找到
z=data1.groupby('country').agg(F.collect_list('names'))
Run Code Online (Sandbox Code Playgroud)
将为我提供国家/地区名称属性和名称属性的值,它将列标题为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()
Run Code Online (Sandbox Code Playgroud)
但收到错误消息
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
Run Code Online (Sandbox Code Playgroud)