【问题标题】:Unsupported language features using PySpark for inserting data into Hive使用 PySpark 将数据插入 Hive 的不受支持的语言功能
【发布时间】:2017-09-21 10:35:41
【问题描述】:

我正在尝试对 Hive 执行此 SQL 插入语句:

insert into mydb.mytable (k, v) values (3, 'c'), (4, 'd')

如果我使用 DBeaver,则此 SQL 语句有效。但是,当我使用 PySpark REPL 时,出现以下异常。

回溯(最近一次通话最后): 文件“”,第 1 行,在 文件“/usr/hdp/2.4.2.0-258/spark/python/pyspark/sql/context.py”,第 580 行,在 sql 中 返回数据帧(self._ssql_ctx.sql(sqlQuery),自我) 文件“/usr/hdp/2.4.2.0-258/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py”,第 813 行,在 __call__ 文件“/usr/hdp/2.4.2.0-258/spark/python/pyspark/sql/utils.py”,第 51 行,在 deco 引发 AnalysisException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.AnalysisException: u"\n查询中不支持的语言功能:插入 mydb.mytable (k, v) 值 (3, 'c'), (4, 'd')\nTOK_QUERY 0, 0,30 , 0\n TOK_FROM 0, -1,30, 0\n TOK_VIRTUAL_TABLE 0, -1,30, 0\n TOK_VIRTUAL_TABREF 0, -1,-1, 0\n TOK_ANONYMOUS 0, -1,-1, 0\n TOK_VALUES_TABLE 1, 15,30, 39\n TOK_VALUE_ROW 1, 17,22, 39\n 3 1, 18,18, 39\n 'c' 1, 21,21, 42\n TOK_VALUE_ROW 1, 25,30, 49 \n 4 1, 26,26, 49\n 'd' 1, 29,29, 52\n TOK_INSERT 1, 0,-1, 12\n TOK_INSERT_INTO 1, 0,13, 12\n TOK_TAB 1, 4, 6, 12\n TOK_TABNAME 1, 4,6, 12\n jvang 1, 4,4, 12\n test1 1, 6,6, 18\n TOK_TABCOLNAME 1, 9,12, 25\nk 1, 9,9 , 25\nv 1, 12,12, 28\n TOK_SELECT 0, -1,-1, 0\n TOK_SELEXPR 0, -1,-1, 0\n TOK_ALLCOLREF 0, -1,-1, 0\n\ nscala.NotImplementedError: 没有解析规则:\n TOK_VIRTUAL_TABLE 0, -1,30, 0\n TOK_VIRTUAL_TABREF 0, -1,-1, 0\n TOK_ANONYMOUS 0, -1,-1 , 0\n TOK_VALUES_TABLE 1, 15,30, 39\n TOK_VALUE_ROW 1, 17,22, 39\n 3 1, 18,18, 39\n 'c' 1, 21,21, 42\n TOK_VALUE_ROW 1, 25 ,30, 49\n 4 1, 26,26, 49\n 'd' 1, 29,29, 52\n \norg.apache.spark.sql.hive.HiveQl$.nodeToRelation(HiveQl.scala:1362) \n;"

我的代码如下。

sql = "insert into mydb.mytable (k, v) values (3, 'c'), (4, 'd')"
sqlContext.sql(sql)

知道为什么会这样吗?有什么方法可以通过 PySpark 将行附加到现有的 Hive 表中?我见过一些使用多个 SQL 插入语句的示例,但我认为这看起来并不高效;我实际上是在尝试通过 PySpark 将批量导入(追加模式)导入现有的 Hive 表。

我正在使用

  • Spark v1.6.1
  • Python v2.7.12
  • Hive v1.2.1000。

【问题讨论】:

  • spark 不支持所有类型的 hive sql,您可以检查 hive-sql 与 spark-sql here 的可比性。
  • Spark 不是用于 OLTP 查询的轻型 JDBC 客户端。这是一个大数据处理框架。具体来说,所有 SQL 查询都被重写为可能产生 不可变文件内存中批处理操作。换句话说:Spark 不支持 Hive ACID 事务,因为 (a) 原子插入完全超出了 Spark 范围,并且 (b) 恕我直言,Hive ACID 的东西很奇怪理智的人应该避免弄乱的玩意儿。

标签: apache-spark hive pyspark hiveql pyspark-sql


【解决方案1】:

我也遇到了 spark 1.6 的错误

java.sql.SQLException: org.apache.spark.sql.AnalysisException: org.apache.spark.sql.hive.HiveQl$.nodeToRelation(HiveQl.scala:1362)

经过搜索,我发现 spark 1.6 使用了不同的语法,在使用该错误后消失了。

例子:

insert into table mytable1 select t.* from (select 'Shub',30) t;

来源:

https://html.developreference.com/article/15215006/SPARK+1.6+Insert+into+existing+Hive+table+

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多