2014-11-21 2 views
2

Я положил некоторые файлы журнала в SQL таблиц через Спарк и моя схема выглядит следующим образом:отказ запроса 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) 

Как вы можете заметить, что я создал поле метки времени, которое я прочитал поддерживается Спарк (Дата Wouldn работаю, насколько я понял). Я бы хотел использовать для запросов типа «where timestamp> (2012-10-08 16: 10: 36.0)», но когда я его запускаю, я продолжаю получать ошибки. Я пробовал эти две следующие формы sintax: Для второго я разбираю строку так, чтобы Im Im Im передавал ее в формате timestamp. Я использую 2 функции: parse и date2timestamp.

Любой намек на то, как я должен обрабатывать значения метки времени?

Спасибо!

1) Скала>sqlContext.sql ("SELECT * FROM Logs, как л где l.timestamp = (2012-10-08 16: 10: 36,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 Logs, как л где l.timestamp =" + date2timestamp (formatTime3.parse ("2012-10-08 16: 10: 36.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] failure: '' STRING '' ожидается, но идентификатор TIMESTAMP найден – bobo32

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

Вывести строковое представление метки времени в метку времени. cast ('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)") 
Смежные вопросы