在 PySpark 中将结构数组扩展为列

2024-06-24

我有一个来自 Google Analytics 的 Spark 数据框,如下所示:

id     customDimensions (Array<Struct>)
100    [ {"index": 1, "value": "Earth"}, {"index": 2, "value": "Europe"}]
101    [ {"index": 1, "value": "Mars" }]

我还有一个“自定义维度元数据”数据框,如下所示:

index   name
1       planet
2       continent

我将使用元数据 df 中的索引,以便将自定义维度扩展到列中。结果应如下所示:

id     planet     continent
100    Earth      Europe
101    Mars       null

我尝试过以下方法,效果很好,但性能极差。我想知道是否有更好的方法。

# Select the two relevant columns
cd = df.select('id', 'customDimensions')

# Explode customDimensions so that each row now has a {index, value}
cd = cd.withColumn('customDimensions', F.explode(cd.customDimensions))

# Put the index and value into their own columns
cd = cd.select('id', 'customDimensions.index', 'customDimensions.value')

# Join with metadata to obtain the name from the index
metadata = metadata.select('index', 'name')
cd = (cd
         .join(metadata, cd.index == metadata.index, 'left')
         .drop(metadata.index))

# Pivot cd so that each row has the id, and we have columns for each custom dimension
piv = cd.groupBy('id').pivot('name').agg(F.first(F.col('value')))

# Join back to restore the other columns
return df.join(piv, df.id == piv.id).drop(piv.id)

假设:

  • 最多有 250 个自定义维度索引,并且名称只能通过元数据数据框得知
  • 原始数据框还有我想维护的其他几个列(因此在我的解决方案末尾加入了连接)

连接是非常昂贵的操作,因为它会导致数据混洗。如果可以的话,您应该避免它或寻求优化它。

您的代码中有两个联接。可以完全避免最后一次连接取回列。可以优化与元数据数据帧的其他连接。由于元数据 df 只有 250 行并且非常多,因此您可以使用broadcast()连接中的提示。这将避免较大数据帧的改组。

我已经做了一些建议的代码更改,但由于我没有您的数据,因此未经过测试。

# df columns list
df_columns = df.columns

# Explode customDimensions so that each row now has a {index, value}
cd = df.withColumn('customDimensions', F.explode(cd.customDimensions))

# Put the index and value into their own columns
cd = cd.select(*df_columns, 'customDimensions.index', 'customDimensions.value')

# Join with metadata to obtain the name from the index
metadata = metadata.select('index', 'name')
cd = cd.join(broadcast(metadata), "index", 'left')

# Pivot cd so that each row has the id, and we have columns for each custom dimension
piv = cd.groupBy(df_columns).pivot('name').agg(F.first(F.col('value')))


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

在 PySpark 中将结构数组扩展为列 的相关文章

随机推荐

  • 如何将小数纪元时间戳(双精度)转换为 std::chrono::time_point?

    我有一个小数纪元时间戳 表示为double 我想转换为适当的std chrono time point 该纪元是自 1970 年 1 月 1 日以来常见的 UNIX 纪元 我知道存在std chrono system clock from
  • 如何判断约会是否是周末?

    给定一个日期作为输入 我如何确定这一天是否是周末 有一个 Weekday 函数 它接受 Date 作为参数并返回日期 1 2 3 等 返回值为 vbSunday 1 vbMonday 2 vbTuesday 3 vbWednesday 4
  • 下载 - 每个用户的最大连接数?

    我有一个 php 脚本 允许用户通过下载恢复下载大文件 这工作正常 但我将 php 代码的下载速度限制为每个连接 200kb s 因此 Mozillas Firefox 下载管理器仅建立一个连接 速度约为 200kb s 但 Free Do
  • Mongoose __v 什么时候改变

    根据http aaronheckmann tumblr com post 48943525537 mongoose v3 part 1 versioning http aaronheckmann tumblr com post 489435
  • 如何提交 git 标签?

    我已成功对中央 git 存储库进行 提交和推送更改 我现在意识到我想标记所有文件的当前版本 所以我这样做 git tag a 0 5 这样就成功了 但现在我尝试git push我被告知没有什么可承诺的 如何将新标签推送到中央存储库 注意gi
  • Javascript 错误的可能情况:“预期标识符、字符串或数字”

    一些用户报告我的网站上偶尔出现 JS 错误 错误消息显示 预期标识符 字符串或数字 行号为 423725915 这只是一个任意数字 并且在发生这种情况时每个报告都会发生变化 这主要发生在 IE7 Mozilla 4 0 浏览器中 我扫描了我
  • C 常用算术转换

    我正在阅读 C99 标准中有关常见算术转换的内容 如果两个操作数具有相同的类型 则无需进一步转换 需要 否则 如果两个操作数都有符号整数类型或者都有 无符号整数类型 较小整数类型的操作数 转换等级转换为大于操作数的类型 秩 否则 如果具有无
  • 为什么每当我使用 scandir() 时,我都会在数组的开头收到句点?

    为什么每当我使用 scandir 时 我都会在数组的开头收到句点 Array 0 gt 1 gt 2 gt bar php 3 gt foo txt 4 gt somedir Array 0 gt somedir 1 gt foo txt
  • 箭头函数参数周围应有括号。 (箭头括号)

    如何避免流量类型错误ES7箭头函数 handleSelectCategory e gt const form this state let newCategories if form categories findIndex c gt c
  • 什么是“具有指定instance_id的DacInstance不存在。(Microsoft SQL Server,36004)”?

    我正在尝试使用 dacpac 升级远程 SQL Server 2012 数据库 但收到以下消息 指定instance id 的DacInstance 不存在 微软 SQL Server 36004 我试图在互联网上搜索但找不到任何东西 有任
  • void* 与 char* 具有相同的表示和内存对齐方式是什么意思?

    我读过一些关于void 类型指针并从标准中找到了此要求 6 2 5 27 指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求 39 类似地 指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求 我看到标准并不保证
  • 如何更改通用Windows平台应用程序中单击事件上按钮的背景颜色?

    我正在 Windows 10 中开发 UWP 应用程序 并且尝试更改单击事件中按钮的背景颜色 这是我的代码 private void button1 1 Click object sender RoutedEventArgs e if Si
  • Delphi TTask - PPL 中匿名函数中的变量捕获如何工作?

    我开始深入研究 Delphi D11 PPL 并编写了这个小例子 procedure TForm2 LaunchTasks const cmax 5 Var ltask ITask i j Integer begin for i 1 to
  • 位置:固定在 IE 6/7/8 和 mozilla 上工作

    我想将 div 的位置固定在页面的右下角 聊天框 我如何通过一个适用于所有 IE6 7 8 和 mozilla 的 css 文件来做到这一点 for我现在有 聊天框 位置 固定 底部 0 右 1 这在 IE 上不起作用 我的限制是我只能编辑
  • C# 套接字编程 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 嘿 我对 C 异步套接字编程做了噩梦 您能给我指点一本深入解释异步编程的指南 教程或书籍吗 如果可能包
  • 扩展对象字面量

    var x name japan age 20 x prototype mad function alert USA x mad 上面的代码不起作用 对象字面量无法扩展 或者x mad 这不是正确的打电话方式 你不能这样做 能够使用它来定义
  • 使用通配符 ID 选择 div

    如何使用 ID 但带有通配符来选择 div 如果 DIV 的 ID 是statusMessage 1098 我想以某种方式选择它 例如document getElementById statusMessage 这是因为在生成页面之前 我不知
  • 找不到 npx 命令

    我正在使用 webpack 我需要执行 node modules webpack bin webpack js using npx npx webpack将运行 webpack 二进制文件 node modules webpack bin
  • 编译并运行金属示例

    我已经有一段时间没有使用 XCode 了 但自从 Apple 批评 XCode 6 和新的 Metal API 以来 我不得不检查一下 他们已经发布了示例 例如Basic3D 示例的转换版本 不过 我在编译和运行它们时遇到了问题 我必须添加
  • 在 PySpark 中将结构数组扩展为列

    我有一个来自 Google Analytics 的 Spark 数据框 如下所示 id customDimensions Array