我正在使用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()
,但运行时间没有差异。
有没有办法更快或更有效地写它。感谢。
答案 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中的大量分区有时需要花费一些时间来写。