【问题标题】:Convert python pandas iterator and string concat into pyspark将 python pandas 迭代器和字符串 concat 转换为 pyspark
【发布时间】:2023-01-18 21:47:17
【问题描述】:

我正在尝试将一个进程从 Pandas 转移到 Pyspark,但我是 Pyspark 的新手。注意:这是一个 EDA 过程,所以我现在不太担心将它作为一个循环,我可以在以后优化它。

设置:

import pandas as pd
import numpy as np
import pyspark.pandas as ps

虚拟数据:

df = ps.DataFrame({'id': ['ID_01', 'ID_02', 'ID_02', 'ID_03', 'ID_03'], 'name': ['Jack', 'John', 'John', 'James', 'Jamie']})
df_pandas = df.to_pandas()
df_spark = df.to_spark()
df
id name
ID_01 Jack
ID_02 John
ID_02 John
ID_03 James
ID_03 Jamie

熊猫代码:

unique_ids = df_pandas['id'].unique()
for unique_id in unique_ids:
  names = '; '.join(sorted(df_pandas[df_pandas['id'] == unique_id]['name'].unique()))
  df.loc[df['id'] == unique_id, 'name'] = names
df
id name
ID_01 Jack
ID_02 John
ID_02 John
ID_03 James; Jamie
ID_03 James; Jamie

最后一个表是所需的输出。但是,我在 PySpark 中实现这个时遇到了问题。这是我必须要做的:

unique_ids = df_spark.select('id').distinct().collect()
for unique_id in unique_ids:
    names = df_spark.filter(df_spark.id == unique_id.id).select('name').distinct()

然后我不确定如何进行下一步;即如何连接生成的单列 DataFrame,也不是如何确保正确替换。

我调查了以下来源,但没有成功(可能是因为我对 PySpark 缺乏经验):

  • This 答案显示了如何连接列而不是行
  • This 答案可能对 loc 转换有帮助(但我还没有成功)
  • This 答案最初被证明是有希望的,因为它也将消除对循环的需要,但我无法弄清楚如何在 collect_list 输出对象上执行 distinctsort 等价物

【问题讨论】:

    标签: python pandas apache-spark pyspark


    【解决方案1】:

    这行得通

    df.groupby("id").agg(F.concat_ws(";", F.collect_list(F.col("name"))).alias("name"))
    

    输入输出

    【讨论】:

    • 感谢您的答复!这类似于我发布的第三个链接。但是,仍然缺少一件 - 找到 collect_list 的唯一值,否则在我的示例中,我们会得到 John; John for ID_02。请问我该怎么做?
    • 好的,错过了.. 实际上你需要 csv 列中的不同值,对吗?
    • 或者您是否需要两行在它们重复时保持原样?
    【解决方案2】:

    尝试:

    import pyspark.sql.functions as f
    
    new_df = (df_spark.distinct()
                      .groupby('id')
                      .agg(f.concat_ws(';', f.collect_list(df_spark['name']))))
    
    out_df = (df_spark.join(new_df, df_spark['id'] == new_df['id'], 'left')
                      .drop(new_df['id']).show())
    

    输出:

    >>> out_df.show()
    
    +-----+-----+--------------------------------+
    | name|   id|concat_ws(;, collect_list(name))|
    +-----+-----+--------------------------------+
    | Jack|ID_01|                            Jack|
    | John|ID_02|                            John|
    | John|ID_02|                            John|
    |James|ID_03|                     James;Jamie|
    |Jamie|ID_03|                     James;Jamie|
    +-----+-----+--------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多