2016-04-16 22 views
3

我使用Spark 1.6.1。在我的Spark Java程序中,我連接到Postgres數據庫,並通過JDBC將每個表註冊爲臨時表。例如:使用HiveContext的Apache Spark查詢不起作用

Map<String, String> optionsTable = new HashMap<String, String>(); 
optionsTable.put("url", "jdbc:postgresql://localhost/database?user=postgres&password=passwd"); 
optionsTable.put("dbtable", "table"); 
optionsTable.put("driver", "org.postgresql.Driver"); 
DataFrame table = sqlContext.read().format("jdbc").options(optionsTable).load();   
table.registerTempTable("table"); 

這工作沒有任何問題:

hiveContext.sql("select * from table").show(); 

而且這個工程:

DataFrame tmp = hiveContext.sql("select * from table where value=key"); 
tmp.registerTempTable("table"); 

,然後我可以看到表的內容有:

hiveContext.sql("select * from table").show(); 

但現在我有一個問題。當我執行此操作時:

hiveContext.sql("SELECT distinct id, timestamp FROM measure, measure_range w WHERE tble.timestamp >= w.left and tble.timestamp <= w.right").show(); 

Spark沒有做​​任何事情,但在Postgres的原始數據庫上它工作得很好。所以我決定修改一下這個查詢:

hiveContext.sql("SELECT id, timestamp FROM measure, measure_range w WHERE tble.timestamp >= w.left").show(); 

這個查詢工作並給了我結果。但另一個查詢不起作用。差異在哪裏,爲什麼第一個查詢不起作用,但第二個工作正常?

而數據庫不是很大。爲了測試它有4 MB的大小。

回答

3

由於您試圖選擇不同的ID,因此您需要選擇時間戳作爲聚合函數的一部分,然後按ID進行分組。否則,它不知道哪個時間戳與ID配對。

+0

感謝您的幫助!當我刪除獨特的查詢正在工作。但是我不知道如何解決您的解決方案中的問題。你能幫助我嗎? –

+0

那麼你必須決定你對使用ID有興趣獲得哪些相應的時間戳。例如,如果你想要最新的,它將是'從測量中選擇id,max(timestamp),measure_range w WHERE tble.timestamp> = w.left group by ID' –

+0

我忘了查詢中的tble。不工作的查詢是:SELECT distinct id,timestamp FROM measure tble,measure_range w WHERE tble.timestamp> = w.left and tble.timestamp <= w.right。當我執行然後:選擇ID,最大(時間戳)從措施tble,measure_range w WHERE tble.timestamp> = w.left和tble.timestamp <= w.right組由wid。 Spark也無所作爲。在網絡用戶界面上它表示一項工作正在運行,但沒有任何事情會發生。 –