Spark SQL:INSERT INTO 语句语法

Posted

技术标签:

【中文标题】Spark SQL:INSERT INTO 语句语法【英文标题】:Spark SQL: INSERT INTO statement syntax 【发布时间】:2016-10-23 16:59:38 【问题描述】:

在阅读 Datastax docs 以了解支持的 Spark SQL 语法时,我注意到您可以像往常一样使用 INSERT 语句:

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")

我错过了什么吗?

【问题讨论】:

据我所知,spark sql 基于 Hive SQL 语法,Language Manual DML for hive 说 “必须为表中的每一列提供值。允许用户使用的标准 SQL 语法尚不支持仅向某些列插入值。为了模仿标准 SQL,可以为用户不希望为其分配值的列提供空值。” 所以提供列可能没有意义从 spark sql 的角度来看。 @VladoDemcak 好吧,从可读性的角度来看,这对我来说很有意义,无论是否有必要为每一列提供一个值。无论如何,这是否意味着 Datastax 文档放错了特定信息? Datastax 文档可能放错了位置 - databricks documentation says only this is possible @VladoDemcak 谢谢 我有同样的问题,我想做“插入到 travelTable (ClientID,SendID,SubscriberKey,EmailAddress,SubscriberID,ListID,EventType,BounceCategory,SMTPCode,BounceReason,BatchID,TriggeredSendExternalKey,EventDateTimestamp,EventDate)值('7247942','536075','000060008489','olgaturdikulova@icloud.com','53911595','318','弹跳','软弹跳','450','邮箱已满','386 ','无','2019-02-25 06:21:09','2019-02-25')" 【参考方案1】:

Spark 支持 hive 语法,所以如果你想插入行,你可以这样做

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

【讨论】:

感谢您的回复。对于简单的插入语句来说似乎过于冗长,但绝对是这样做的一种方式。 需要将数据插入某些列而不是全部列的情况如何?例如:一个表有三列 col0、col1 和 col2,我需要插入值 int col0 和 col2。我该怎么做? 我看不出你的解决方案比问题中已经提供的解决方案更好(省略列名) 如果 spark 数据源支持自定义模式(实现 SchemaRelationProvider)并允许省略某些列。您可以创建一个单独的表映射,其中仅包含要更新的列并在该表上使用插入。

以上是关于Spark SQL:INSERT INTO 语句语法的主要内容,如果未能解决你的问题,请参考以下文章

使用T-SQL语句操作数据表-插入数据

access SQL语句中 insert into

insert into 语句错误

INSERT INTO 语句的语法错误

SQL INSERT INTO 语句

关于SQL语句中的insert用法