web-dev-qa-db-ja.com

Spark DataFrameをHive内部テーブルに挿入するには?

追加モードでDFをHive内部テーブルに挿入する正しい方法は何ですか。 「saveAsTable」メソッドを使用してDFをHiveに直接書き込むことができるようですOR一時テーブルにDFを保存し、クエリを使用します。

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

OR

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

2番目のアプローチでは、レコードを追加するか上書きしますか?

DFをHive内部テーブルに効果的に書き込む他の方法はありますか?

5
Shankar

df.saveAsTable("tableName", "append")は非推奨です。代わりに、2番目のアプローチが必要です。

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

テーブルが存在しない場合、テーブルを作成します。コードを2回実行するときは、既存のテーブルを削除する必要があります。そうしないと、コードは例外で終了します。

別のアプローチ、テーブルを削除したくない場合。テーブルを個別に作成し、そのテーブルにデータを挿入します。

以下のコードは、既存のテーブルにデータを追加します

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

そして、以下のコードはデータを既存のテーブルに上書きします

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

この答えは、Spark 1.6.2。Sparkの他のバージョンを使用している場合、適切なドキュメントを確認することをお勧めします。

6
Sandeep Singh

答えが書かれてから、ここでのオプションはどちらも機能しなかった/おそらく減価した。

最新の spark API docs (Spark 2.1)の場合)によると、DataFrameWriterclassのinsertInto()メソッドを使用しています

Python PySpark API を使用していますが、Scalaでも同じです:

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

上記は私のために働いた。

13

挿入するパーティションを挿入して上書きすることもできますし、動的パーティションでそれを行うこともできます。

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