24

我正在尝试使用我的 HiveContext 运行插入语句,如下所示:

hiveContext.sql('insert into my_table (id, score) values (1, 10)')

1.5.2 Spark SQL 文档没有明确说明是否支持这一点,尽管它确实支持“动态分区插入” 。

这会导致堆栈跟踪,例如

AnalysisException: 
Unsupported language features in query: insert into my_table (id, score) values (1, 10)
TOK_QUERY 0, 0,20, 0
  TOK_FROM 0, -1,20, 0
    TOK_VIRTUAL_TABLE 0, -1,20, 0
      TOK_VIRTUAL_TABREF 0, -1,-1, 0
        TOK_ANONYMOUS 0, -1,-1, 0
      TOK_VALUES_TABLE 1, 13,20, 41
        TOK_VALUE_ROW 1, 15,20, 41
          1 1, 16,16, 41
          10 1, 19,19, 44
  TOK_INSERT 1, 0,-1, 12
    TOK_INSERT_INTO 1, 0,11, 12
      TOK_TAB 1, 4,4, 12
        TOK_TABNAME 1, 4,4, 12
          my_table 1, 4,4, 12
      TOK_TABCOLNAME 1, 7,10, 22
        id 1, 7,7, 22
        score 1, 10,10, 26
    TOK_SELECT 0, -1,-1, 0
      TOK_SELEXPR 0, -1,-1, 0
        TOK_ALLCOLREF 0, -1,-1, 0

scala.NotImplementedError: No parse rules for:
 TOK_VIRTUAL_TABLE 0, -1,20, 0
  TOK_VIRTUAL_TABREF 0, -1,-1, 0
    TOK_ANONYMOUS 0, -1,-1, 0
  TOK_VALUES_TABLE 1, 13,20, 41
    TOK_VALUE_ROW 1, 15,20, 41
      1 1, 16,16, 41
      10 1, 19,19, 44

有没有其他方法可以插入到受支持的 Hive 表

4

6 回答 6

27

append可以使用DataFrameWriter 上的模式将数据附加到 Hive 表。

data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").saveAsTable("my_table")

这给出了与插入相同的结果。

于 2015-11-25T18:48:03.107 回答
14

我遇到了同样的问题(Spark 1.5.1),并尝试了不同的版本。

给定

sqlContext.sql("create table my_table(id int, score int)")

唯一有效的版本如下所示:

sqlContext.sql("insert into table my_table select t.* from (select 1, 10) t")
sqlContext.sql("insert into       my_table select t.* from (select 2, 20) t")
于 2015-11-27T15:51:32.170 回答
10

接受的答案saveAsTable对我来说失败了AnalysisException(我不明白为什么)。对我有用的是:

data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").insertInto("my_table")

我正在使用 Spark v2.1.0。

于 2017-04-26T12:03:13.990 回答
1

您尝试执行数据文件格式无法执行的操作,因此出现Unsupported language features in query异常。

许多数据文件格式是一次性写入的,不支持 ACID 操作。

如果需要,Apache ORC 支持 ACID 操作。

相反,您可以使用分区将数据拆分为文件夹 (/data/year=2017/month=10....),在这里您可以将数据附加/插入到数据湖中。

于 2017-10-20T19:34:22.350 回答
-1

hiveContext.sql("insert into table my_table select 1, 10") 如果您没有将动态分区模式更改为非严格,请尝试此操作,您必须这样做hiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict")

于 2016-08-23T12:50:53.087 回答
-2

当你第一次这样做

$data.write.mode("append").saveAsTable("my_table")

您应该替换"append""overwrite",然后,您可以使用"append".

于 2018-01-04T06:30:43.130 回答