2016-10-23 27 views
1

在閱讀Datastax docs爲Spark支持的SQL語法,我注意到你可以使用INSERT之類的語句,你通常會做:星火SQL:INSERT INTO語句的語法

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

測試了這一點,在Spark 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語法和[語言手冊DML(https://開頭cwiki .apache.org/confluence/display/Hive/LanguageManual + DML#LanguageManualDML-Synopsis.3)for hive says *「必須爲表中的每一列提供值。標準的SQL語法允許用戶只將值插入有些列還不被支持,爲了模仿標準SQL,可以爲用戶不希望分配值的列提供空值。「*因此,從spark sql的角度提供列是沒有意義的。 – VladoDemcak

+0

@VladoDemcak好吧,從可讀性的角度來看,對我來說是否有意義,是否有必要爲每一列提供一個值。無論如何,這是否意味着Datastax文檔錯誤地放置了特定信息? – TMichel

+1

可能Datastax文檔放錯位置 - [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

謝謝你的回覆。似乎對於一個簡單的插入語句來說太冗長了,但絕對是這樣做的一種方式。 – TMichel

+0

當需要將數據插入某些列而不是所有列時,情況如何?例如:一個表有三列col0,col1和col2,我需要插入值int col0和col2。我怎樣才能做到這一點? –