繁体   English   中英

一种更有效的计算Spark数据框的方法

[英]a more efficient way to compute a spark dataframe

我的销售数据框类似于:

id   | date              | amount  
-----|-------------------|-------
1    |2016-03-04 12:03:00|10.40
1    |2016-03-04 12:05:10|5.0
1    |2016-03-04 12:15:50|11.30
1    |2016-03-04 12:16:00|9.40
1    |2016-03-04 12:30:00|10.0
1    |2016-03-04 12:40:00|5.40

我正在尝试按时间范围为10分钟的时间分组并求和,然后创建类似于以下内容的数据框:

date             | amount  
-----------------|-------
2016-03-04 12:00 |0.0
2016-03-04 12:10 |15.40
2016-03-04 12:20 |20.70
2016-03-04 12:30 |10.0
2016-03-04 12:40 |5.40

我试图循环datetime变量,过滤数据框,组和总和,而不是追加到列表中,并使用列表创建一个数据框。

bar_list = []
while date_loop < final_date:
    start_time = date_loop - datetime.timedelta(minutes=10)
    end_time = date_loop - datetime.timedelta(seconds=1)
    df_range = (df_sale
               .filter((df_sale.date >= start_time) & (df_sale.date <= end_time))
               .groupby()
               .sum('amount'))
  bar_list.append((date_loop,df_range.head()['sum(amount)']))
  date_loop += datetime.timedelta(minutes=10)

fields = ['date','amount']
df = sqlContext.createDataFrame(bar_list,fields).na.fill(0)

在一个包含214626行的文件中,此代码最多可能需要20分钟才能计算出10分钟内2个月的销售额。

有没有更有效的方法?我了解我可以在工人之间共享变量,可以共享列表吗? 是我的瓶颈吗?

谢谢。

如果要作为字符串处理,这可能有点脏,可以尝试以下操作:

def getDTClosestMin(s:String):String = {
 s.substring(0,4)+"-"+s.substring(5,7)+"-"+s.substring(8,10)+" " +
 s.substring(11,13)+":" +
 ((((s.substring(14,16)).toInt)*0.1).ceil)*10).round.toString.padTo(2,"0").mkString }


timeAmtRDD.map(x=> x._1+","+x._2+","+x._3)
  .map(x=>x.split(","))
  .map(x=> (getDTClosestMin(x(1)), x(2).toFloat))
  .reduceByKey(_+_)
  .sortByKey().toDF("date", "amount").show()


Output:
+----------------+------+
|            date|amount|
+----------------+------+
|2016-03-04 12:10|  15.4|
|2016-03-04 12:20|  20.7|
|2016-03-04 12:30|  10.0|
|2016-03-04 12:40|   5.4|
+----------------+------+

更新这花了什么时间..;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM