"INSERT INTO ..." с SparkSQL HiveContext

Я пытаюсь запустить оператор вставки с моим HiveContext, например так:

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

В документации SQL Server 1.5.2 Spark явно не указано, поддерживается ли она или нет, хотя она поддерживает "динамическую вставку раздела".

Это приводит к трассировке стека, как

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, которая поддерживается?

6 ответов

Решение

Данные могут быть добавлены в таблицу Hive с помощью append режим на DataFrameWriter.

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

Это дает тот же результат, что и вставка.

У меня была та же проблема (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")

Принятый ответ saveAsTable терпит неудачу для меня с AnalysisException (Я не понимаю почему). Что работает для меня вместо этого:

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

Я использую Spark v2.1.0.

Вы пытались выполнить то, что формат файла данных не может, следовательно, Unsupported language features in query исключение.

Многие форматы данных имеют однократную запись и не поддерживают операцию ACID.

Apache ORC поддерживает работу с ACID, если вам это нужно.

Вместо этого вы можете использовать раздел для разделения ваших данных на папки (/data/year=2017/month=10....), здесь вы можете добавлять / вставлять данные в озеро данных.

Когда вы впервые делаете это

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

вы должны заменить "append" с "overwrite"Тогда вы можете использовать "append",

Попробуй это hiveContext.sql("insert into table my_table select 1, 10")если вы не изменили режим динамического разбиения на нестрогий, вы должны сделать это hiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict")

Другие вопросы по тегам