追加モードで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内部テーブルに効果的に書き込む他の方法はありますか?
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の他のバージョンを使用している場合、適切なドキュメントを確認することをお勧めします。
答えが書かれてから、ここでのオプションはどちらも機能しなかった/おそらく減価した。
最新の spark API docs (Spark 2.1)の場合)によると、DataFrameWriter
classのinsertInto()
メソッドを使用しています
Python PySpark API を使用していますが、Scalaでも同じです:
df.write.insertInto(target_db.target_table,overwrite = False)
上記は私のために働いた。
挿入するパーティションを挿入して上書きすることもできますし、動的パーティションでそれを行うこともできます。
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))