【发布时间】:2022-10-13 01:06:44
【问题描述】:
我有一个 PySpark DataFrame,其地图列如下:
root
|-- id: long (nullable = true)
|-- map_col: map (nullable = true)
| |-- key: string
| |-- value: double (valueContainsNull = true)
map_col 具有需要根据字典进行转换的键。例如,字典可能是:
mapping = {'a': '1', 'b': '2', 'c': '5', 'd': '8' }
因此,DataFrame 需要更改为:
[Row(id=123, map_col={'a': 0.0, 'b': -42.19}),
Row(id=456, map_col={'a': 13.25, 'c': -19.6, 'd': 15.6})]
到以下:
[Row(id=123, map_col={'1': 0.0, '2': -42.19}),
Row(id=456, map_col={'1': 13.25, '5': -19.6, '8': 15.6})]
如果我可以写出字典,我看到transform_keys 是一个选项,但它太大并且在工作流程的早期动态生成。我认为explode/pivot 也可以工作,但似乎表现不佳?
有任何想法吗?
编辑:添加了一点以显示map_col 中map 的大小不统一。
【问题讨论】:
-
你到底从哪里得到
0.0、-42.19等?当“映射”具有重复键时会发生什么?或者你将a重命名为b,而b已经存在于map_col中? -
它太大并且在工作流程的早期动态生成- 为什么这些很重要?您可以广播 dict 以使其跨执行者访问
-
您的地图列是否始终包含相同数量的键?或者它至少受到一个已知数字的限制?
-
@OneCricketeer 我正在从早期的流程/作业中捕获整个 DataFrame。映射不会有重复的键(在
map_col或mapping字典中。重命名的值也保证不会重叠。关于太大,我的意思是我对transform_key的理解是它必须是作为expr的一部分写出来。不过,我当然可以广播这本词典。 -
@Arseny 不-键是更大的一组独特可能性的某个子集-不一定是相同的长度。它们受到已知数量的限制 - 最多可能有大约 400 个左右的唯一键。
标签: apache-spark pyspark