apache-spark - 如何为两个数据帧创建分区,而几个分区可以位于 Spark 上的同一实例/机器上?
问题描述
我们有两个 DataFrame:df_A,df_B
假设,两者都有大量的行。我们需要对它们进行分区。如何将他们划分为夫妻?
例如,分区号为 5:
- df_A 分区:partA_1、partA_2、partA_3、partA_4、partA_5
- df_B 分区:partB_1、partB_2、partB_3、partB_4、partB_5
如果我们有 5 台机器:
- machine_1:partA_1 和 partB_1
- machine_2:partA_2 和 partB_2
- machine_3:partA_3 和 partB_3
- machine_4:partA_4 和 partB_4
- machine_5:partA_5 和 partB_5
如果我们有 3 台机器:
- machine_1:partA_1 和 partB_1
- machine_2:partA_2 和 partB_2
- machine_3:partA_3 和 partB_3
- ...(当机器空闲时)...
- machine_1:partA_4 和 partB_4
- machine_2:partA_5 和 partB_5
注意:如果其中一个 DataFrame 足够小,我们可以使用广播技术。
当两个(或两个以上)DataFrame 都足够大时该怎么办(如何分区)?
解决方案
我认为我们需要退后一步。只看大尺寸方面,而不是广播。
Spark 是一个框架,它根据数据帧分区的协同定位为您的应用程序管理事物,考虑分配的资源与可用的资源和 Action 的类型,因此如果 Workers 需要获取分区进行处理。
repartition
s 是Transformations
。当Action
, 如write
:
peopleDF.select("name", "age").write.format("parquet").save("namesAndAges.parquet")
发生然后事情开始了。
- 如果你有一个 JOIN,那么如果需要重新分区和移动,Spark 就会解决。
- 也就是说,如果您
join
对两个 DF 都在 c1 上,那么重新分区很可能会发生在 c1 列上,因此 DF 中针对该 c1 列的出现被洗牌到相同的节点,其中有一个空闲的 Executor 驻留等待服务于 2 个或更多分区的 JOIN。 - 这仅在调用 Action 时发生。这样,如果你做了不必要的 Transformation,Catalyst 就可以避免那些事情。
- 此外,对于使用的分区数量,这是一个很好的链接恕我直言:spark.sql.shuffle.partitions of 200 default partitions conundrum
推荐阅读
- node.js - 无法让 puppeteer 重用同一浏览器浏览新收集的链接
- python - 如何在 scala 中读取包含在 python 中的长数字
- xpath - 无法使用 xpath 编码匹配精确符号“&”“<”“>”
- javascript - 如何将 eval(ID) 从列表视图传递到 asp.net 上的模式弹出窗口
- python - 使用特定列将抓取的数据导出到 CSV
- netlogo - 在 NetLogo 中改变海龟变量的好方法是什么?
- angular - 如何解决使用自定义验证器语法遇到的错误?
- java - Java除法运算符没有给出预期的结果
- react-native - 如何使用 React Native 制作警报事件?
- python-3.x - 为什么会引发 http.client.IncompleteRead 异常?