当前位置: 首页 > 知识库问答 >
问题:

提高Spark反规范化/分区性能

胡安怡
2023-03-14

我有一个非规范化用例——一个hiveavro事实表与14个较小的维度表连接,生成一个非规格化拼花输出表。输入事实表和输出表都以相同的方式进行分区(Category=TEST1,YearMonthId=202101)。我确实运行历史处理,这意味着一次处理并加载给定类别的几个月。

我使用的是Spark 2.4.0/pyspark数据帧,所有表连接的广播连接,动态分区插入,最后使用colasce来控制输出文件的数量。(在最后一个阶段看到一次洗牌可能是因为动态分区插入)

想知道在管理分区方面可能的优化——比如从输入到输出阶段保持分区的一致性,这样就不会涉及混洗。希望利用输入和输出存储表由相同列分区的事实。

我也在考虑这个问题——通过确定分区来使用静态分区写,并并行写入分区——这会有助于加速或避免混乱吗?

感谢任何能引导我走向正确方向的帮助。

共有1个答案

凤棋
2023-03-14

下面我尝试的几个选项提高了性能(两次都避免小文件)。

>

  • 在广播连接之前尝试在数据帧中使用重新分区(而不是合并),这最大限度地减少了洗牌,从而减少了洗牌溢出。-重新分区(计数,*分区列列表,任何其他Salting列)(如果重新分区不是偶数,则添加加盐列)

    确保基表被正确压缩。在某些情况下,这甚至可能消除对#1的需求,并减少任务的#,从而减少由于任务调度而导致的开销。

  •  类似资料:
    • 使用Spark 2.4.0。我的生产数据非常歪斜,因此其中一项任务的时间是其他任务的7倍。我尝试了不同的策略来规范数据,以便所有执行者都能平等工作- spark.default。并行性 reduceByKey(numPartitions) 重新分区(numPartitions) 我的期望是这三个选项应该均匀分区,但是在Spark Local/Standalone上使用一些虚拟的非生产数据表明,选项

    • 如何规范化主要由嵌套数组组成的 spark 数据帧? 我想要类似emple的东西,它将保留(id,foo,bar,baz)的模式,但为数组的每个值返回一个单独的记录。最终结果不应再包含数组。 Foo和baz是相关的。它们的顺序不得扭曲。它们总是具有相同的长度,foo的第一个值与baz的第一个数值相关,以此类推。也许我应该先将它们组合成一个列/结构? 最终结果应如下所示: 部分相关问题-爆炸(转置?

    • 我有一个名为内容的实体类型。 实体类型具有一对一关系。 SurveyData 实体实际上是一个映射的超类。它最终将有几十个用于存储来自不同调查数据的实体子类。 根据文档,我创建了一个自定义规范化器,它基于键处理非规范化: 有了这个,我可以完美地创建一个嵌入了SurveyData的新提交。下面是我发送给POST请求的JSON示例: 但是,当我通过 GET 获取集合或单个提交实体时,API 平台返回的

    • 主要内容:范式的类型规范化是在数据库中组织数据的过程。 规范化用于最小化关系或关系集的冗余。 它还用于消除插入,更新和删除异常等不良特性。 规范化将较大的表分成较小的表,并使用关系链接它们。 普通表单用于减少数据库表中的冗余。 范式的类型 有四种类型的范式: 范式 描述说明 1NF 如果它包含原子值,则关系为第范式(1NF)。 2NF 如果它在1NF中,则关系将在2NF中,并且所有非关键属性完全依赖于主键。 3NF

    • 问题内容: 在Python中,是否存在标准化unicode字符串的标准方法,以使其仅包含可用于表示它的最简单的unicode实体? 我的意思是,一些东西,想翻译的顺序来? 查看问题出在哪里: 但现在: 当然,我可以遍历所有字符并进行手动替换等,但是效率不高,我敢肯定我会错过一半的特殊情况,并且会犯错误。 问题答案: 该模块提供一个功能,您要标准化为NFC格式: NFC或“普通形式组合”返回组成的字

    • 问题内容: 在Java中创建XML规范格式的最简单方法是什么?你有一些完成的代码吗?我在网上找到了几个链接,例如this,this和this,但我无法使其正常工作:/ 谢谢, 伊万 编辑:我使用了在那里提出的规范化器,但是得到了奇怪的结果。更精确地说,此方法不会删除元素之间的空格…这就是我得到的: 问题答案: Apache XML Security项目 的Canonicalizer类: