【问题标题】:Create df key->count mapping from multiple dfs从多个 dfs 创建 df key->count 映射
【发布时间】:2022-07-28 01:43:49
【问题描述】:

我有 3 个输入 dfs,格式如下:

key | irrelevant_data
----------------------
 A  |   asdfg 
 B  |   asdfg 

key | irrelevant_data
----------------------
 C  |   asdfg 
 B  |   asdfg 

我想将 3 组合成一个类似字典的 df,它将映射键->计算它的显示次数

即从上面的例子:

key | count
----------------------
 A  |   1 
 C  |   1 
 B  |   2 

运行一次后,我需要将数据保留在 dict 中以供下一次迭代使用,该迭代将有 3 个新的输入 dfs。我们可能会遇到相同的键 - 在这种情况下,增加计数。这样做的目的是一旦计数达到 3,我想将其从表中删除并获取该键。

我正在考虑将输入 dfs 之一转换为 MapType(在 dfs 中保证键是唯一的,但在所有 3 个输入 dfs 中并非如此):

df1 = df1.withColumn("propertiesMap", F.create_map(
    F.col("key"), F.lit(1)
))

但在那之后,我不确定如何从其他 2 个 dfs 中添加行并增加计数(如果键已经存在,如果不存在则创建新行)。我对python很熟悉,就这么简单:

# pseudocode of what I essentially want in PySpark, where dict is a df
dict = {}
for curr_df in dfs:
    for key, _ in curr_df.items():
        dict[key] += 1

【问题讨论】:

    标签: dataframe apache-spark dictionary pyspark apache-spark-sql


    【解决方案1】:

    所以你有 6 个 dfs。您可以unionunionByName 所有这些,然后gruopBy('key') 并使用count 聚合。

    df = (
        df1
        .unionByName(df2)
        .unionByName(df3)
        .unionByName(df4)
        .unionByName(df5)
        .unionByName(df6)
        .groupBy('key')
        .count()
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-15
      • 2018-06-05
      • 2019-01-12
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 2023-02-22
      相关资源
      最近更新 更多