我有一个包含两列的数据框,如下所示:
df = spark.createDataFrame([('A', 'Science'),
('A', 'Math'),
('A', 'Physics'),
('B', 'Science'),
('B', 'English'),
('C', 'Math'),
('C', 'English'),
('C', 'Latin')],
['Group', 'Subjects'])
Group Subjects
A Science
A Math
A Physics
B Science
B English
C Math
C English
C Latin
我需要遍历“组”列中每个唯一值的数据并执行一些处理。我正在考虑创建一个字典,每个组名作为键,而其相应的“主题”列表作为值。
所以,我的预期输出如下:
{A:['Science', 'Math', 'Physics'], B:['Science', 'English'], C:['Math', 'English', 'Latin']}
如何在pyspark中实现这一目标?
答案 0 :(得分:1)
检查一下:您可以执行groupBy
并使用collect_list
。
#Input DF
# +-----+-------+
# |group|subject|
# +-----+-------+
# | A| Math|
# | A|Physics|
# | B|Science|
# +-----+-------+
df1 = df.groupBy("group").agg(F.collect_list("subject").alias("subject")).orderBy("group")
df1.show(truncate=False)
# +-----+---------------+
# |group|subject |
# +-----+---------------+
# |A |[Math, Physics]|
# |B |[Science] |
# +-----+---------------+
dict = {row['group']:row['subject'] for row in df1.collect()}
print(dict)
# {'A': ['Math', 'Physics'], 'B': ['Science']}
答案 1 :(得分:0)
如果需要独特的主题,可以使用collect_set,否则可以使用collect_list。
Class1 obj = new Class1();
obj.getVariable1()
结果:
import pyspark.sql.functions as F
df = spark.createDataFrame([('A', 'Science'),
('A', 'Math'),
('A', 'Physics'),
('B', 'Science'),
('B', 'English'),
('C', 'Math'),
('C', 'English'),
('C', 'Latin')],
['Group', 'Subjects'])
df_tst=df.groupby('Group').agg(F.collect_set("Subjects").alias('Subjects')).withColumn("dict",F.create_map('Group',"Subjects"))