在附加模式下将DF插入Hive内部表的正确方法是什么。我们似乎可以使用" saveAsTable"直接将DF写入Hive。方法或将DF存储到临时表,然后使用查询。
df.write().mode("append").saveAsTable("tableName")
OR
df.registerTempTable("temptable")
sqlContext.sql("CREATE TABLE IF NOT EXISTS mytable as select * from temptable")
第二种方法会附加记录还是覆盖它?
有没有其他方法可以有效地将DF写入Hive Internal表?
答案 0 :(得分:9)
这里没有任何选项适用于我/可能已经折旧了,因为答案是写的。
根据最新的spark API docs(针对Spark 2.1),它使用insertInto()
类中的DataFrameWriter
方法
我使用Python PySpark API,但在Scala中也是如此:
df.write.insertInto(target_db.target_table,overwrite = False)
以上对我有用。
答案 1 :(得分:5)
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,我建议您查看相应的文档。
答案 2 :(得分:0)
您还可以插入并覆盖要插入的分区,并且可以使用动态分区来完成。
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))