web-dev-qa-db-fra.com

"INSERT INTO ..." avec SparkSQL HiveContext

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 ?

21
Kirk Broadhurst

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.

23
Kirk Broadhurst

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")
13
Beryllium

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.

8
abeboparebop

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.

1
Thomas Decaux