2015-10-14 53 views
1

我有兩個數據框,一個包含以下格式(eventData)的事件詳細信息。加入包含時間範圍的火花數據幀的時間序列數據框

|id|parameter |value|eventtime   | 
+++++++++++++++++++++++++++++++++++++++++++ 
|1 |temperature|23 |2005-Apr-11 11:20:00| 
|2 |temperature|21 |2005-Apr-12 14:34:00| 

,另一種是包含一個時間範圍

Operationdata

|operationid|paramter |start_time   |end_time   | 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
|1234  |Temperature|2005-Apr-11 10:20:00|2005-Apr-11 12:20:00| 
|1235  |Temperature|2005-Apr-12 14:00:00|2005-Apr-11 16:30:00| 

現在,我想加入這兩個dataframes下面的輸出獲取。

|operationid|paramter |value|eventtime   | 
++++++++++++++++++++++++++++++++++++++++++++++++++++ 
|1234  |Temperature|23 |2005-Apr-11 11:20:00| 
|1235  |Temperature|21 |2005-Apr-12 14:34:00| 

我可以做到這一點使用下面的SQL查詢

joinSQL = sqlContext.sql("select OperationDF.operationid,eventDF.parameter,eventDF.value,eventDF.eventtime from eventDF,OperationDF where eventDF.eventtime >= jdbcDF.start_time AND eventDF.eventtime <= jdbcDF.end_time") 

此查詢在我想要的方式返回數據,但它確實在兩個dataframes之間的笛卡兒積。

OperationDF實際上是從RDBMS中獲取的,我必須在OperationDF上執行SQLContext.cacheTable以避免多個查詢到數據庫。

我是新手引發和我的查詢現在是

  1. 有沒有更好的方式做加入,避免笛卡兒積

  2. 不SQLContext.cacheTable保持駕駛員記憶數據幀的內容還是將分佈在一個集羣?

  3. 如果將它保存在驅動程序內存中,我們如何處理Dataframe太大而無法保存在驅動程序內存中的情況。

謝謝。

回答

0

SQLContext.cacheTable是否將Dataframe內容保留在驅動程序內存中,還是將分佈在集羣中?

每個DataFrameRDD分佈在工作節點上。除非你collect沒有數據應該存儲在驅動程序。

有沒有更好的方式做加入,避免笛卡兒積

除非內部引擎可以優化這種類型或範圍加入,而據我所知,在這一刻它不能,答覆編號

如果您有一些可用於限制結果的附加信息(如最大偶數跨度),則可以使用附加謂詞來改進此結果。

如果不是,並且您可以承受全部排序,則可以使用低級API和/或某些窗口函數組合來處理此問題。