如何在pyspark中创建具有两个数据框列的字典?

时间:2020-07-01 12:51:03

标签: python pyspark

我有一个包含两列的数据框,如下所示:

    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中实现这一目标?

2 个答案:

答案 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"))