将sparkDataframe直接写入配置单元会花费太多时间

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

我写了2个Dataframe从Spark直接到Hive使用 PySpark . 第一个df只有一行和7列。第二个df有20m行和20列。写1df(1row)需要10分钟,在第二个df中写1m行需要大约30分钟。我不知道要花多长时间来写整个20米,我杀死了代码才能完成。
我尝试了两种方法来编写df。我还缓存了df,看看它是否能加快写入速度,但似乎没有任何效果:

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

第二种方法

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

在第二种方法中,我尝试同时使用这两种方法 registerTempTable() 以及 createOrReplaceTempView() 但在运行时间上没有差别。
有没有办法写得更快或更有效。谢谢。

oprakyz7

oprakyz71#

是否确定缓存了最终表?可能的问题是,在写入数据之前,它会计算整个管道。您可以在spark运行的终端/控制台中进行检查。
另外,请检查您在配置单元上附加到的表是否不是临时视图—然后可能是在附加新行之前重新计算视图的问题。当我向配置单元写入数据时,我总是使用:

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

请尝试:

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

wn9m85ua2#

尝试重新分区到少量文件,比如说like.repartition(2000),然后写入配置单元。spark中的大量分区有时需要时间来编写。

dohp0rv5

dohp0rv53#

它的坏主意(或设计)做插入到Hive表。您必须将其另存为文件并在其上创建一个表,或者将其作为分区添加到现有表中。
你能试试那条路吗。

相关问题