[英]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.