【问题标题】:Spark joins- save as dataframes or partitioned hive tablesSpark 连接 - 保存为数据帧或分区配置单元表
【发布时间】:2018-08-20 22:39:30
【问题描述】:

我正在开展一个项目,其测试数据接近 100 万条记录和 4 个此类文件。 任务是执行大约 40 次计算,连接来自 4 个不同文件的数据,每个文件接近 1gb。

目前,我使用 saveastable 将每个数据保存到 spark 表中并执行操作。例如-table1 与 table2 连接,结果保存到 table3。 Table3(1 和 2 的结果)与 table4 连接,依此类推。最后,我将这些计算保存在不同的表上并生成报告。

整个过程大约需要 20 分钟,我担心当这段代码进入生产环境时,数据可能比这多 5 倍,会不会出现性能问题。

或者最好以分区方式保存每个文件中的这些数据,然后执行连接并到达最终结果集。

P.S - 目标是获得即时结果,并且可能存在用户正在更新文件中的几行并期望即时结果的情况。而且数据是按月计算的,基本上每个月一次,里面有分类和子分类。

【问题讨论】:

  • 它们需要应用相同的分区,但实际上可能已经如此。尝试比较结果。
  • 你能详细说明一下吗?
  • 你帖子的标题有点令人困惑。反正。听起来您没有将大表与较小的表连接起来。而是N个大表。线索是以相同的方式对数据帧进行分区以减少洗牌。希望连接键是通用的,如果不是,您可以明智地选择以减少洗牌。
  • 更新有很多含义。

标签: apache-spark-sql


【解决方案1】:

您所做的一切都很好,但请确保在每次资源扩展操作后缓存 + 计数,而不是写入所有连接,然后在最后一步保存。

如果中间不缓存,spark会在最后一步从上到下运行整个DAG,可能会导致JVM在操作过程中溢出溢出到磁盘,进而影响执行时间。

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 2015-09-29
    • 1970-01-01
    • 2017-08-16
    • 2021-02-12
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多