【问题标题】:PySpark groupby elements with key of their occurencePySpark groupby 元素及其出现的键
【发布时间】:2021-01-24 00:51:36
【问题描述】:

我在 DATAFRAME 中有这些数据:

id,col
65475383,acacia
63975914,acacia
65475383,excelsa
63975914,better

我想要一个包含“word”列以及与之关联的每个 id 的字典,如下所示:

word:key
acacia: 65475383,63975914
excelsa: 65475383
better: 63975914

我尝试了 groupBy,但这是一种聚合数据的方法,如何解决这个问题?

【问题讨论】:

    标签: python sql apache-spark dictionary pyspark


    【解决方案1】:

    我不确定您是否打算将结果作为 Python 字典或数据框(从您的问题中不清楚)。

    但是,如果您确实想要一个 Dataframe,那么一种计算方法是:

    from pyspark.sql.functions import collect_list
    
    idsByWords = df \
        .groupBy("col") \
        .agg(collect_list("id").alias("ids")) \
        .withColumnRenamed("col", "word")
    

    这将导致:

    idsByWords.show(truncate=False)
    
    +-------+--------------------+
    |word   |ids                 |
    +-------+--------------------+
    |excelsa|[65475383]          |
    |better |[63975914]          |
    |acacia |[65475383, 63975914]|
    +-------+--------------------+
    

    然后您可以将该数据框转换为 Python 字典:

    d = {r.asDict()["word"]: r.asDict()["ids"] for r in idsByWords.collect()}
    

    最终得到:

    {
       'excelsa': [65475383], 
       'better': [63975914], 
       'acacia': [65475383, 63975914]
    }
    

    请注意,collect 如果超出驱动程序内存,可能会导致驱动程序崩溃。

    【讨论】:

    • 嗨,etherealyn!感谢您的解决方案!是的,我的意图是有一个具有上述数据帧字典值的广播变量
    • @gammauniversity 在这种情况下,请检查更新的答案。
    • 嗯,我看到你的注释在最后,我不打算使用collect,这个字典将用作一个广播变量作为查找表
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多