如何将Spark DataFrame插入Hive内部表?

Sha*_*kar 5 hive scala apache-spark-sql spark-dataframe

在附加模式下将DF插入Hive内部表的正确方法是什么.看来我们可以使用"saveAsTable"方法直接将DF写入Hive,或者将DF存储到临时表,然后使用查询.

df.write().mode("append").saveAsTable("tableName")
Run Code Online (Sandbox Code Playgroud)

要么

df.registerTempTable("temptable") 
sqlContext.sql("CREATE TABLE IF NOT EXISTS mytable as select * from temptable")
Run Code Online (Sandbox Code Playgroud)

第二种方法会附加记录还是覆盖它?

有没有其他方法可以有效地将DF写入Hive Internal表?

Spc*_*ond 13

这里没有任何选项适用于我/可能已经贬值,因为答案是写的.

根据最新的spark API文档(适用于Spark 2.1),它使用的insertInto()DataFrameWriter类中的方法

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

df.write.insertInto(target_db.target_table,overwrite = False)
Run Code Online (Sandbox Code Playgroud)

以上对我有用.


San*_*ngh 6

df.saveAsTable("tableName", "append")不推荐使用。相反,您应该使用第二种方法。

sqlContext.sql("CREATE TABLE IF NOT EXISTS mytable as select * from temptable")
Run Code Online (Sandbox Code Playgroud)

如果表不存在,它将创建表。当您第二次运行代码时,您需要删除现有表,否则您的代码将异常退出。

另一种方法,如果您不想删除表。单独创建一个表,然后将数据插入该表。

下面的代码会将数据追加到现有表中

sqlContext.sql("insert into table mytable select * from temptable")
Run Code Online (Sandbox Code Playgroud)

下面的代码将数据覆盖到现有表中

sqlContext.sql("insert overwrite table mytable select * from temptable")
Run Code Online (Sandbox Code Playgroud)

该答案基于Spark 1.6.2。如果您使用的是其他版本的Spark,我建议您检查相应的文档。