J'essaie d'exécuter une instruction insert avec mon contexte Hive, comme ceci:
hiveContext.sql('insert into my_table (id, score) values (1, 10)')
Le 1.5.2 Spark Documentation SQL n'indique pas explicitement si cela est pris en charge ou non, bien qu'il prenne en charge "l'insertion de partition dynamique".
Cela conduit à une trace de pile comme
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
Y a-t-il un autre moyen d'insérer dans une table Hive qui est pris en charge ?
Les données peuvent être ajoutées à une table Hive en utilisant le mode append
sur le DataFrameWriter.
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").saveAsTable("my_table")
Cela donne le même résultat qu'un insert.
J'ai eu le même problème (Spark 1.5.1) et essayé différentes versions.
Donné
sqlContext.sql("create table my_table(id int, score int)")
Les seules versions qui ont fonctionné ressemblaient à ceci:
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")
La réponse acceptée saveAsTable
échoue pour moi avec un AnalysisException
(je ne comprends pas pourquoi). Ce qui fonctionne pour moi à la place est:
data = hc.sql("select 1 as id, 10 as score")
data.write.mode("append").insertInto("my_table")
J'utilise Spark v2.1.0.
Vous avez essayé d’exécuter quelque chose que le format de fichier de données ne peut pas, d’où le Unsupported language features in query
exception.
De nombreux formats de fichiers de données sont en écriture unique et ne prennent pas en charge les opérations ACID.
Apache ORC prend en charge le fonctionnement ACID si vous en avez besoin.
Au lieu de cela, vous pouvez utiliser une partition pour diviser vos données en dossiers (/ data/year = 2017/month = 10 ....). Vous pouvez ici ajouter/insérer des données dans votre lac de données.