2016-10-23 3 views
1

При чтении Datastax docs для поддерживаемого синтаксиса искрового SQL, я заметил, что вы можете использовать INSERT заявления, как вы обычно делаете:Спарк SQL: INSERT INTO синтаксиса оператора

INSERT INTO hello (someId,name) VALUES (1,"hello") 

Испытание это в искры 2.0 (Python) окружающая среда и подключение к базе данных Mysql, бросает ошибку:

File "/home/yawn/spark-2.0.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/sql/utils.py", line 73, in deco 
pyspark.sql.utils.ParseException: 
u'\nmismatched input \'someId\' expecting {\'(\', \'SELECT\', \'FROM\', \'VALUES\', \'TABLE\', \'INSERT\', \'MAP\', \'REDUCE\'}(line 1, pos 19)\n\n== SQL ==\nINSERT INTO hello (someId,name) VALUES (1,"hello")\n-------------------^^^\n' 

Однако если удалить явное определение столбца, он работает, как ожидалось:

INSERT INTO hello VALUES (1,"hello") 

Я что-то пропустил?

+0

Как я знаю, искра SQL основан на улей SQL синтаксиса и [Language Manual DML] (https: // cwiki .apache.org/confluence/display/Hive/LanguageManual + DML # LanguageManualDML-Synopsis.3) для hive says * "Значения должны быть предоставлены для каждого столбца таблицы. Стандартный синтаксис SQL, который позволяет пользователю вставлять значения только в некоторые столбцы еще не поддерживаются. Чтобы имитировать стандартный SQL, для столбцов можно указать нули, которые пользователь не хочет присваивать значения. "*, поэтому, вероятно, не имеет смысла предоставлять столбцы с точки зрения искра sql. – VladoDemcak

+0

@ VladoDemcak хорошо, это имеет смысл для меня с точки зрения читаемости, необходимо или нет, чтобы обеспечить значение для каждого столбца. В любом случае, означает ли это, что Datastax docs не учитывает эту конкретную информацию? – TMichel

+1

Вероятно, Datastax docs неуместен - [Документация databricks говорит только об этом возможно] (https://docs.databricks.com/spark/latest/spark-sql/language-manual/insert.html#) – VladoDemcak

ответ

0

Спарк синтаксис поддержки улей, так что если вы хотите, чтобы вставить строку, которую вы можете сделать следующее

insert into hello select t.* from (select 1, 'hello') t; 
+0

Спасибо вы за свой ответ. Кажется слишком многословным для простой инструкции insert, но определенно способ сделать это. – TMichel

+0

Как насчет случая, когда нужно вставлять данные в некоторые столбцы, а не все? например: таблица имеет три столбца col0, col1 и col2, и мне нужно вставить значения int col0 и col2. Как я могу это сделать? –

Смежные вопросы