如何将sparkDataframe插入到配置单元内部表?

q7solyqu  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(304)

在append模式下向配置单元内部表插入df的正确方法是什么。似乎我们可以使用“saveastable”方法直接将df写入hive,或者将df存储到temp表,然后使用查询。

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

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

第二种方法是追加记录还是覆盖记录?
有没有其他方法可以有效地将df写入hive内部表?

7lrncoxx

7lrncoxx1#

您还可以插入并覆盖正在插入的分区,您可以使用动态分区来完成。

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

owfi6suc2#

这两个选项对我都不起作用/可能因为答案写好而贬值了。
根据最新的sparkapi文档(对于spark2.1),它使用 insertInto() 方法从 DataFrameWriter
我使用的是python pyspark api,但在scala中是相同的:

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

以上这些对我很有用。

hgncfbus

hgncfbus3#

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的其他版本,我建议您检查相应的文档。

相关问题