Spark 按列重新分区,每列动态分区数

2024-05-07

如何根据列中的项目数对 DataFrame 进行分区。假设我们有一个包含 100 人的 DataFrame(列是first_name and country),我们希望为一个国家/地区的每 10 个人创建一个分区。

如果我们的数据集包含 80 个中国人、15 个法国人和 5 个古巴人,那么我们需要 8 个中国分区、2 个法国分区和 1 个古巴分区。

这是不起作用的代码:

  • df.repartition($"country"):这将为中国创建 1 个分区,为法国创建 1 个分区,为古巴创建 1 个分区
  • df.repartition(8, $"country", rand):这将为每个国家创建最多 8 个分区,因此应该为中国创建 8 个分区,但法国和古巴分区未知。法国可以分为 8 个分区,古巴最多可以分为 5 个分区。看这个答案 https://stackoverflow.com/questions/53037124/partitioning-a-large-skewed-dataset-in-s3-with-sparks-partitionby-method更多细节。

这是repartition()文档:

当我看着repartition()方法,我什至没有看到带有三个参数的方法,所以看起来有些行为没有记录。

有没有办法动态设置每列的分区数量?这将使创建分区数据集变得更加容易。


由于 Spark 数据分区的方式,您将无法完全实现这一点。 Spark 获取您在重新分区中指定的列,将该值散列为 64b 长,然后将该值除以分区数。这样分区的数量是确定的。它以这种方式工作的原因是,除了确保两侧的散列相同之外,连接还需要连接左侧和右侧的分区数量匹配。

“我们希望为一个国家的每 10 个人创建一个分区。”

您到底想在这里完成什么?一个分区中只有 10 行可能会降低性能。您是否正在尝试创建一个分区表,其中分区中的每个文件都保证只有 x 行数?

"df.repartition($"country"): 这将为中国创建 1 个分区,为法国创建 1 个分区,为古巴创建 1 个分区"

这实际上会创建一个数据框,其中包含按国家/地区散列的默认洗牌分区数

  def repartition(partitionExprs: Column*): Dataset[T] = {
    repartition(sparkSession.sessionState.conf.numShufflePartitions, partitionExprs: _*)
  }

"df.repartition(8, $"country", rand):这将为每个国家创建最多 8 个分区,因此应该为中国创建 8 个分区,但法国和古巴分区未知。法国可能有 8 个分区古巴最多可以分为 5 个分区。有关更多详细信息,请参阅此答案。”

同样,这是微妙的错误。只有 8 个分区,而国家/地区基本上是在这 8 个分区中随机排列的。

编辑:最后一点澄清。数据帧重新分区的工作方式与编写分区时执行的partitionBy(...) 方法不同。 partitionBy 操作 Spark 首先获取所有 Spark 分区,而不是每个 Spark 分区。是将其切片为表分区,然后将每个分区写入与分区列对应的文件夹中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark 按列重新分区,每列动态分区数 的相关文章

随机推荐

  • 如何在点击事件上调用 Angular 组件 [Angular]

    我不是 Angular 方面的专家 我也遵循了互联网上的一些答案 特别this https stackoverflow com questions 17636528 how do i load an html page in a div u
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • 使用继承的 ES6 React 类时未触发 componentDidMount 方法

    我试图在 React 中使用 ES6 类 并希望所有组件都继承某些方法 但是一旦我尝试扩展扩展 React Component 类的组件 componentDidMount 方法就不会触发 因此什么也不会发生被渲染 我正在使用的代码 基础组
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 不兼容的类型:HomeFragment 无法转换为 Android 中的 Fragment

    我在这部分代码中遇到错误 private void displayView int position update the main content by replacing fragments Fragment fragment null
  • Python:球体的交集

    我对编程非常陌生 但我决定承担一个有趣的项目 因为我最近学会了如何以参数形式表示球体 当三个球体相交时 有两个不同的交点 除非它们仅在一个奇点处重叠 球体的参数表示 我的代码是根据答案修改的Python matplotlib 绘制 3d 立
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • 在 Spark Dataframe 中提取数组索引

    我有一个带有数组类型列的数据框 例如 val df List a Array 1d 2d 3d b Array 4d 5d 6d toDF ID DATA df org apache spark sql DataFrame ID strin
  • 是否可以静默运行 .NET Core 控制台应用程序(隐藏控制台窗口)?

    我正在尝试为自己自动化一些任务 并且编写了一些 NET Core 1 0 控制台应用程序 其中之一是 BrowserRouter 一个简单的应用程序 它基于 URL 模式 决定当我单击 HTTP S 链接时要打开哪个浏览器 浏览器配置文件
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • cmake MSYS Makefiles 生成器丢失

    我通过 pacman 安装了 cmake 3 2 3 当我尝试从 msys64 shell 中使用它时出现错误 cmake G MSYS Makefiles CMake Error Could not create named genera
  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • 不使用 razor viewengine 进行 Nancy 本地化

    目前我在 Nancy 使用 razor 作为我的视图引擎 我可以在剃刀中像这样访问我的资源文件 Text text greeting 但我想切换到不同的视图引擎 是否有其他支持 TextResource 的视图引擎 在超级简单的视图引擎中本
  • 将“密码”类型添加到 Google Apps 脚本输入框

    是否可以将 密码 类型分配给 Google Apps 脚本输入框 以便不显示文本 以下工作正常 但输入字段是一个简单的文本框 并显示文本而不是 Browser inputBox Please enter your password 我有一个
  • 将现有项目文件夹添加到 eclipse 中的项目资源管理器

    这里可能是一个非常直接的解决方案 但似乎找不到答案 我最近将 Eclipse 工作区更改为我的 dropbox 文件夹 这样我在大学时可以在上网本上工作 在家时可以在桌面上工作 我将所有项目文件夹从旧工作区复制并粘贴到 dropbox 工作
  • 什么时候应该使用 ThrowHelper 方法而不是直接抛出?

    什么时候适合使用投掷助手方法而不是直接抛出 void MyMethod throw new ArgumentNullException paramName ThrowArgumentNullException paramName void
  • 这个角色是什么? ➡️0080➡0099

    这个字符是什么 u0080 u0099 这应该是撇号或单引号 我如何将它 使用 Ruby 转换为简单的单引号 或者在网页中将其作为单引号正确显示 Thanks 这是一个印刷正确的撇号 更准确地说是右单引号 U 2019 经过一些错误的字符代
  • CORS 与 Amazon S3 和 Cloudfront

    我有一个托管在 Heroku 上的 Rails 应用程序 它使用 CloudFront 以及托管在 S3 上的资产 它完美地显示了资产 尽管需要一些努力 我的 Cloudfront 设置 Forward Headers Whitelist
  • 为什么 C# 中没有“fieldof”或“methodof”运算符? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 它们可以如下使用 FieldInfo field fieldof string Empty MethodInfo method1 methodo
  • Spark 按列重新分区,每列动态分区数

    如何根据列中的项目数对 DataFrame 进行分区 假设我们有一个包含 100 人的 DataFrame 列是first name and country 我们希望为一个国家 地区的每 10 个人创建一个分区 如果我们的数据集包含 80