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

Posted

技术标签:

【中文标题】将 Spark Dataframe 直接写入 HIVE 需要太多时间【英文标题】:Writing Spark Dataframe directly to HIVE is taking too much time 【发布时间】:2017-11-14 19:43:05 【问题描述】:

我正在使用PySpark 将 2 个数据帧从 Spark 直接写入 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(),但运行时间没有区别。

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

【问题讨论】:

【参考方案1】:

您确定决赛桌已缓存吗?可能是在写入数据之前它会计算整个管道的问题。您可以在运行 Spark 的终端/控制台中检查。

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

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

请尝试:

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

【讨论】:

【参考方案2】:

插入蜂巢表是个坏主意(或设计)。您必须将其保存为文件并在其上创建一个表或将其作为分区添加到现有表中。

请你试试那条路线。

【讨论】:

你能解释一下"add as a partition to existing table"吗? 根据用户提出的问题本身,这不一定是正确的。下划线火花催化剂与 df 相同。有没有关于此的 spark 开发人员说明?【参考方案3】:

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

【讨论】:

以上是关于将 Spark Dataframe 直接写入 HIVE 需要太多时间的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - 如何将 DataFrame 写入文本文件?

Spark:将DataFrame写入Mysql

将 spark DataFrame 写入表

Spark - 如何将约 20TB 的数据从 DataFrame 写入配置单元表或 hdfs?

spark利用sparkSQL将数据写入hive两种通用方式实现及比较

spark利用sparkSQL将数据写入hive两种通用方式实现及比较