Ответ 1
Данные могут быть добавлены в таблицу Hive, используя режим append
в DataFrameWriter.
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").saveAsTable("my_table")
Это дает тот же результат, что и вставка.
Я пытаюсь запустить инструкцию insert с моим 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, которая поддерживается?
Данные могут быть добавлены в таблицу 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....), здесь вы можете добавлять/вставлять данные в свое озеро данных.
попробуйте hiveContext.sql("insert into table my_table select 1, 10")
если вы не изменили режим динамического раздела на нестрогий, вы должны сделать это hiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict")
Когда вы впервые это сделаете,
$data.write.mode("append").saveAsTable("my_table")
вам следует заменить "append"
на "overwrite"
. Затем вы можете использовать "append"
.