簡體   English   中英

如何將Spark DataFrame插入Hive內部表?

[英]How to insert Spark DataFrame to Hive Internal table?

在附加模式下將DF插入Hive內部表的正確方法是什么。 看來我們可以使用“saveAsTable”方法直接將DF寫入Hive,或者將DF存儲到臨時表,然后使用查詢。

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

要么

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

第二種方法會附加記錄還是覆蓋它?

有沒有其他方法可以有效地將DF寫入Hive Internal表?

這里沒有任何選項適用於我/可能已經貶值,因為答案是寫的。

根據最新的spark API文檔 (適用於Spark 2.1),它使用DataFrameWriter類中的insertInto()方法

我正在使用Python PySpark API,但它在Scala中是相同的:

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

以上對我有用。

不推薦使用df.saveAsTable("tableName", "append") 相反,你應該采取第二種方法。

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

如果表不存在,它將創建表。 當您第二次運行代碼時,您需要刪除現有表,否則您的代碼將退出異常。

另一種方法,如果你不想丟桌子。 單獨創建一個表,然后將數據插入該表。

以下代碼將數據附加到現有表中

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

以下代碼將數據覆蓋到現有表中

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

這個答案基於Spark 1.6.2。 如果您使用的是其他版本的Spark,我建議您查看相應的文檔。

您也可以插入並覆蓋正在插入的分區,您可以使用動態分區來完成。

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM