web-dev-qa-db-fra.com

Comment insérer Spark DataFrame to Hive Internal table?

Quelle est la bonne façon d'insérer DF dans le tableau interne Hive en mode ajout. Il semble que nous pouvons directement écrire le DF dans Hive en utilisant la méthode "saveAsTable" OR stocker la table DF dans temp puis utiliser la requête.

df.write().mode("append").saveAsTable("tableName")

OR

df.registerTempTable("temptable") 
sqlContext.sql("CREATE TABLE IF NOT EXISTS mytable as select * from temptable")

La deuxième approche ajoutera-t-elle les enregistrements ou les remplacera-t-elle?

Existe-t-il un autre moyen d'écrire efficacement le DF dans la table interne Hive?

6
Shankar

df.saveAsTable("tableName", "append") est obsolète. Au lieu de cela, vous devriez la deuxième approche.

sqlContext.sql("CREATE TABLE IF NOT EXISTS mytable as select * from temptable")

Il créera une table si la table n'existe pas. Lorsque vous exécuterez votre code une deuxième fois, vous devez supprimer la table existante, sinon votre code se terminera avec exception.

Une autre approche, si vous ne voulez pas laisser tomber la table. Créez une table séparément, puis insérez vos données dans cette table.

Le code ci-dessous ajoutera des données dans le tableau existant

sqlContext.sql("insert into table mytable select * from temptable")

Et le code ci-dessous écrasera les données dans la table existante

sqlContext.sql("insert overwrite table mytable select * from temptable")

Cette réponse est basée sur Spark 1.6.2. Dans le cas où vous utilisez une autre version de Spark je suggère de vérifier la documentation appropriée.

6
Sandeep Singh

Aucune des options ici n'a fonctionné pour moi/probablement dépréciée depuis que la réponse a été écrite.

Selon les derniers spark API docs (pour Spark 2.1), il utilise la méthode insertInto() de la classe DataFrameWriter

J'utilise Python PySpark API mais ce serait la même chose dans Scala:

df.write.insertInto(target_db.target_table,overwrite = False)

Ce qui précède a fonctionné pour moi.

14
Spcogg the second

Vous pouvez également insérer et simplement écraser la partition dans laquelle vous insérez et vous pouvez le faire avec un partitionnement dynamique.

spark.conf.set("Hive.exec.dynamic.partition.mode", "nonstrict")

temp_table = "tmp_{}".format(table)
df.createOrReplaceTempView(temp_table)
spark.sql("""
    insert overwrite table `{schema}`.`{table}`
    partition (partCol1, partCol2)
      select col1       
           , col2       
           , col3       
           , col4   
           , partCol1
           , partCol2
    from {temp_table}
""".format(schema=schema, table=table, temp_table=temp_table))
0
uh_big_mike_boi