【发布时间】: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