2017-01-18 53 views
1

我想在Spark數據框中存儲超過200,000個時間系列變量,並且要確保每個時間系列的日期與主鍵集匹配在1-1-1930和1-1-2017之間的所有日子。最終目標是構建基於貝葉斯的模型,該模型使用許多時間序列作爲特定時間序列的預測變量。眼下在Scala數據框中用公用密鑰存儲大量時間序列數據

+---------------------+----------------------+ 
|timeSeries1_date  |timeSeries1_value  | 
+---------------------+----------------------+ 
|   1997-01-01|     10.49| 
|   1997-01-02|     15.64| 
|   1997-01-03|     53.06| 
|     ....|     ....| 
+---------------------+----------------------+ 

我試圖做一個完整的外部聯接每個額外的時間序列增加了總體組時間序列:我讀取XML時間串聯成星火數據幀,看起來像這樣

allSeries = allSeries.join(series, allSeries.col("date") === newSeries.col("timeSeries2_date"), "outer") 
allSeries = allSeries.drop("timeSeries2_date") 

輸出看起來是這樣的:

+---------------------+----------------------+----------------------+ 
|date     |timeSeries1_value  |timeSeries2_value  | 
+---------------------+----------------------+----------------------+ 
|   1997-01-01|     10.49|     11.93| 
|   1997-01-02|     15.64|     null| 
|   1997-01-03|     53.06|     43.04| 
|     ....|     ....|     ....| 
+---------------------+----------------------+----------------------+ 

此連接變爲它是不可用的點極其緩慢。我的經驗主要是關係數據庫,所以我無法理解這種情況下正確的方法。我甚至需要將這些數據加入到相同的Dataframe中?有沒有更有效的方法來做到這一點?

回答

0

您應該避免在大型數據集上使用交叉連接 - 正如您所提到的那樣,速度非常慢。

你可以通過時間戳分組數據(你需要一個時間粒度 - dayofmonthhourmonthyear)解決您的問題,然後用aggAPI或定製UDAF應用聚合函數。舉例來說,如果你的任務是計算平均每日價格以下數據幀:

scala> data.show() 
+----------+-------+ 
| timestamp| price| 
+----------+-------+ 
|1997-01-01| 10.49| 
|1997-01-01|1150.63| 
|1997-01-02| 15.64| 
|1997-01-03| 53.06| 
+----------+-------+ 

可以按如下步驟實現它:

scala> data.groupBy(dayofmonth(col("timestamp")).alias("day")).agg(mean(col("price")).alias("mean_daily_price")).show() 
+----+-----------------+ 
|day |mean_daily_price | 
+----+-----------------+ 
| 1|580.5600000000001| 
| 3|   53.06| 
| 2|   15.64| 
+----+-----------------+ 
+0

謝謝你的見解!我正在使用一個相當乾淨的數據集,每天,每月或每年僅包含一個值。我的目標是建立一個基於貝葉斯的時間序列模型,模擬許多指標時間序列對一個特定時間序列的影響。我不是在尋找平均值或計算一個時間序列內的任何值。你是否在說我可以將每個時間序列保存到一個單獨的數據框中,並以某種方式將它聚合成某種數據框? – jskracht

+0

我用'mean'作爲例子。你可以使用'UDAF'和一些自定義的'evaluate'方法。你能給出一個(簡化的)例子,說明你對輸出數據幀做了什麼樣的分析?即你如何匹配'timeSeries1_value'和'timeSeries2_value'? –

+0

我在R中使用這個工具https://google.github.io/CausalImpact/CausalImpact.html,它期望所有的數據都是矩陣類型的格式,正如我試圖在上面實現的那樣。我不需要完全遵循這種模式,但我確實需要確保能夠排列來自每個時間序列的廣泛不同的日期,以便我可以將它們關聯起來。 – jskracht