开发者社区> 问答> 正文

指定列的Spark sql问题

我们正在尝试将oracle db复制到hive中。我们从oracle获取查询并在hive中运行它们。所以,我们以这种格式得到它们:

INSERT INTO schema.table(col1,col2) VALUES ('val','val');
虽然此查询直接在Hive中工作,但当我使用spark.sql时,我收到以下错误:

org.apache.spark.sql.catalyst.parser.ParseException:
mismatched input 'emp_id' expecting {'(', 'SELECT', 'FROM', 'VALUES', 'TABLE', 'INSERT', 'MAP', 'REDUCE'}(line 1, pos 20)
== SQL ==
insert into ss.tab(emp_id,firstname,lastname) values ('1','demo','demo')
--------------------^^^

    at org.apache.spark.sql.catalyst.parser.ParseException.withCommand(ParseDriver.scala:217)
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:114)
    at org.apache.spark.sql.execution.SparkSqlParser.parse(SparkSqlParser.scala:48)
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parsePlan(ParseDriver.scala:68)
    at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:623)
    at org.apache.spark.sql.SQLContext.sql(SQLContext.scala:691)
    at com.datastream.SparkReplicator.insertIntoHive(SparkReplicator.java:20)
    at com.datastream.App.main(App.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

展开
收起
社区小助手 2018-12-21 10:54:29 7356 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    由于Spark SQL不支持insert语句中的列列表,因此出现此错误。所以从insert语句中排除列列表。

    下面是我的hive表:

    0: jdbc:hive2://hpchdd2-zk-1.hpc.ford.com:218> select * from UDB.emp_details_table;
    emp_id emp_name emp_dept emp_joining_date
    1 AAA HR 2018-12-06
    1 BBB HR 2017-10-26
    2 XXX ADMIN 2018-10-22
    2 YYY ADMIN 2015-10-19
    2 ZZZ IT 2018-05-14
    3 GGG HR 2018-06-30

    在这里我通过pyspark使用spark sql插入记录
    df = spark.sql("""insert into UDB.emp_details_table values ('6','VVV','IT','2018-12-18')""");
    您可以在下面看到给定记录已插入到我现有的配置单元表中。

    emp_id emp_name emp_dept emp_joining_date
    1 AAA HR 2018-12-06
    1 BBB HR 2017-10-26
    2 XXX ADMIN 2018-10-22
    2 YYY ADMIN 2015-10-19
    2 ZZZ IT 2018-05-14
    3 GGG HR 2018-06-30
    6 VVV IT 2018-12-18

    将您的spark sql查询更改为:spark.sql(“”“插入ss.tab值('1','demo','demo')”“”);

    注意:我使用spark 2.3,如果你使用的是spark 1.6版本,你需要使用hive上下文。

    2019-07-17 23:23:17
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载