【问题标题】:Efficiently aggregrate (fitler/select) a large dataframe in a loop and create new dataframe在循环中有效地聚合(过滤/选择)大型数据帧并创建新数据帧
【发布时间】:2021-01-31 01:20:29
【问题描述】:

我有 1 个通过导入 csv 文件 (sparkscv) 创建的大型数据框。这个数据框有很多行每日数据。数据按日期、地区、service_offered 和计数标识。

我过滤 region 和 service_offered 并汇总计数(总和)并将其汇总到一个月。每次在循环中运行过滤器时,它都会选择一个区域,然后是 service_offered 并对其进行聚合。

如果我一遍又一遍地将它附加到 df 大 0 开始发生并且它变得非常慢。有360个办公室,每个办公室大约有5-10个服务。如何在制作最终数据帧之前先将选择/过滤器保存到列表并附加它们?

我看到了这篇帖子 Using pandas .append within for loop,但它只显示 list.a 和 list.b。 360 列表呢?

这是我循环/聚合数据的代码

#spark session
spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()

#spark schema
schema = StructType([
  StructField('office', StringType(), True),
  StructField('service', StringType(), True),
  StructField('date', StringType(), True),
  StructField('count', IntegerType(), True)
  ])

#empty dataframe
office_summary = spark.createDataFrame(spark.sparkContext.emptyRDD(),schema)
office_summary .printSchema()

x = 1
try :
  for office in office_lookup :
  office = office[0]
  print(office_locations_count - x, " office(s) left")
  x = x + 1
    for transaction in service_lookup :
    transaction = transaction[0]  
    monthly_counts = source_data.filter((col("office").rlike(office)) & (col("service").rlike(transaction))).groupby("office", "service", "date").sum()
    #office_summary = office_summary.unionAll(monthly_counts)
except Exception as e:
print(e)

我知道返回的结果比预期的多,但这不是当前数据的问题。前 30% 的过程非常快,然后开始按预期放慢速度。

如何将过滤结果保存到列表中,一遍又一遍地追加或加入,最后创建最终数据框?这段代码确实完成了,但它应该不需要 30 分钟才能运行。

谢谢!

【问题讨论】:

  • 你为什么要在嵌套循环中这样做?
  • @Andrew - 你问我的可能是我正在寻找的答案。嵌套循环使我可以将“办公室”与每种“服务”类型结合起来。是否有另一种方法可以在该部分进行聚合?
  • 你能同时使用 1 个或多个 groupby() 调用吗?
  • @Andrew - 现在使用 Spark,不需要像你提到的那样循环。感谢您的输入。我会写一个更详细的帖子供其他人参考

标签: list dataframe loops apache-spark-sql databricks


【解决方案1】:

在@Andrew 的帮助下,我能够继续使用 Pyspark Dataframes 来完成这项工作。被清除的命令如下所示。

df2 = df1.groupby("Column1", "Column2", "Column3").agg(sum('COUNT'))

这使我能够基于 df1 创建一个新的数据框,其中在一行上满足分组和聚合。此命令大约需要 0.5 秒才能执行,而在初始帖子中则相反。

不断创建新数据框并将旧数据框保留在内存中是问题所在。这是最有效的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 2020-08-05
    • 1970-01-01
    • 2017-04-04
    • 2021-09-26
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多