2014-11-21 79 views
2

我把一些日誌文件到SQL表通過Spark和我的模式是這樣的:SparkSQL時間戳查詢失敗

|-- timestamp: timestamp (nullable = true) 
|-- c_ip: string (nullable = true) 
|-- cs_username: string (nullable = true) 
|-- s_ip: string (nullable = true) 
|-- s_port: string (nullable = true) 
|-- cs_method: string (nullable = true) 
|-- cs_uri_stem: string (nullable = true) 
|-- cs_query: string (nullable = true) 
|-- sc_status: integer (nullable = false) 
|-- sc_bytes: integer (nullable = false) 
|-- cs_bytes: integer (nullable = false) 
|-- time_taken: integer (nullable = false) 
|-- User_Agent: string (nullable = true) 
|-- Referrer: string (nullable = true) 

正如你可以看到我創建了一個時間戳字段,我讀出由星火支持(日期止跌根據我的理解,我的工作沒有那麼成功)。我很喜歡用於「where timestamp>(2012-10-08 16:10:3​​6.0)」的查詢,但是當我運行它時,我不斷收到錯誤。 我試過以下2個sintax格式: 對於第二個我解析一個字符串,所以我確定我實際上是以時間戳格式傳遞它。 我使用2個函數:解析date2timestamp

任何提示我應該如何處理時間戳值?

謝謝!

1) 階>sqlContext.sql( 「SELECT * FROM日誌作爲升其中l.timestamp =(2012-10-08 16:10:3​​6.0)」。)收集

java.lang.RuntimeException: [1.55] failure: ``)'' expected but 16 found 

SELECT * FROM Logs as l where l.timestamp=(2012-10-08 16:10:36.0) 
               ^

2) sqlContext.sql( 「SELECT * FROM日誌作爲升其中l.timestamp =」 + date2timestamp(formatTime3.parse( 「2012-10-08 16:10:3​​6.0」))。)收集

java.lang.RuntimeException: [1.54] failure: ``UNION'' expected but 16 found 

SELECT * FROM Logs as l where l.timestamp=2012-10-08 16:10:36.0 
               ^

回答

5

我想這個問題是時間戳首先精度,也是字符串,我通過代表時間戳必須被鑄造爲字符串

因此,此查詢現在可用:

sqlContext.sql("SELECT * FROM Logs as l where cast(l.timestampLog as String) <= '2012-10-08 16:10:36'") 
4

你忘了報價單分數。

試試這個語法:

L.timestamp = '2012-07-16 00:00:00' 

或者,嘗試

L.timestamp = CAST('2012-07-16 00:00:00' AS TIMESTAMP) 
+0

我已經試圖把周圍的時間戳單引號,它看起來像,因爲結果集是空的,它不該」它不會讀它作爲一個時間戳噸。 我也試過CAST AS建議,但它也不起作用。我明確地得到這個錯誤: java.lang.RuntimeException:[1.76]失敗:''STRING''預期但找到標識符TIMESTAMP – bobo32 2014-11-23 20:52:40

0

不幸的是,這並沒有爲我工作。我正在使用Apache Spark 1.4.1。下面的代碼是我的解決方案:

Date date = new Date(); 

String query = "SELECT * FROM Logs as l where l.timestampLog <= CAST('" + new java.sql.Timestamp(date.getTime()) + "' as TIMESTAMP)"; 

sqlContext.sql(query); 

鑄造timestampLog作爲字符串沒有拋出任何錯誤,但不會返回任何數據。

1

將時間戳記的字符串表示形式轉換爲時間戳記。 ('2012年10月10日12:00:00'作爲時間戳)然後,你可以做比較作爲時間戳,而不是字符串。相反的:

sqlContext.sql("SELECT * FROM Logs as l where cast(l.timestampLog as String) <= '2012-10-08 16:10:36'") 

嘗試

sqlContext.sql("SELECT * FROM Logs as l where l.timestampLog <= cast('2012-10-08 16:10:36' as timestamp)")