将Spark Dataframe直接写入HIVE需要花费太多时间

时间:2017-11-14 19:43:05

标签: apache-spark hive pyspark

我正在使用PySpark将Spark中的2个数据帧直接写入Hive。第一个df只有一行和7列。第二个df有20M行和20列。写入1 df(1row)需要10分钟,在第二个DF中写入1M行需要大约30分钟。我不知道写完整个20M需要多长时间,我在代码完成之前就杀了它。

我尝试过编写df的两种方法。我也缓存了df以确定它是否会使写入更快但似乎没有任何影响:

df_log.write.mode("append").insertInto("project_alpha.sends_log_test")

第二种方法

#df_log.registerTempTable("temp2")
#df_log.createOrReplaceTempView("temp2")
sqlContext.sql("insert into table project_alpha.sends_log_test select * from temp2")

在第二种方法中,我尝试同时使用registerTempTable()createOrReplaceTempView(),但运行时间没有差异。

有没有办法更快或更有效地写它。感谢。

3 个答案:

答案 0 :(得分:2)

您确定最终表格是否已缓存?可能是在写入数据之前计算整个管道的问题。您可以在终端/控制台中检查Spark运行的位置。

另外,请检查您在Hive上附加的表是否不是临时视图 - 然后可能是在追加新行之前重新计算视图的问题。 当我向Hive写入数据时,我总是使用:

df.write.saveAsTable('schema.table', mode='overwrite')

请尝试:

df.write.saveAsTable('schema.table', mode='append')

答案 1 :(得分:0)

将错误的想法(或设计)插入到hive表中。您必须将其另存为文件并在其上创建一个表,或者将其作为分区添加到现有表中。

请你试试那条路。

答案 2 :(得分:0)

尝试将其分区为少量文件,例如说.repartition(2000),然后写入配置单元。 spark中的大量分区有时需要花费一些时间来写。