I'm trying to run an insert statement with my HiveContext, like this:
hiveContext.sql('insert into my_table (id, score) values (1, 10)')
The 1.5.2 Spark SQL Documentation doesn't explicitly state whether this is supported or not, although it does support "dynamic partition insertion".
This leads to a stack trace like
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
Is there any other way to insert to a Hive table that is supported?
You tried to perform something that the data file format cannot, hence the
Unsupported language features in query
exception.Many data file format are write-once and no support ACID operation.
Apache ORC supports ACID operation if you need it.
Instead, you can use partition to split your data into folders (/data/year=2017/month=10....), here you can append/insert data into your data lake.
I've had the same problem (Spark 1.5.1), and tried different versions.
Given
The only versions that worked looked like this:
The accepted answer
saveAsTable
fails for me with anAnalysisException
(I don't understand why). What works for me instead is:I'm using Spark v2.1.0.
When you first time do this
you should replace
"append"
with"overwrite"
, Then, you can use"append"
.Data can be appended to a Hive table using the
append
mode on the DataFrameWriter.This gives the same result as an insert.
try this
hiveContext.sql("insert into table my_table select 1, 10")
if you haven't change your dynamic partition mode to nonstrict, you have to do thishiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict")