python - 在pyspark的范围整数列表中查找整数列表的最佳方法是什么
问题描述
我有一个范围列表,如下所示:
我有一个值列表,如下所示:
现在我需要做的是,对于“值列表”中的每个值,我需要获取“范围列表”中行的索引,以便该值介于“从”和“到”之间在“范围列表”中的该行。
假设:
- 两个列表都是数据框(我更愿意这样做是 pyspark)
- “范围列表”中可能有重叠,在这种情况下返回所有可能的范围索引
- From 和 To 值包含在内
- “范围列表”可以有超过 1 亿行
- “值列表”的长度将始终小于“范围列表”。(虽然我的图片没有显示)
用例子解释上面的内容,
“值列表”中的第一项是“17”,它所属的范围将在“范围列表”的索引 2 处,因为 17 介于 15 和 19 之间。
“值列表”中的第二项是“51”,它所属的范围将在“范围列表”的索引 9 处,因为 51 介于 50 和 54 之间。
我想知道是否有任何快速/有效的方法来查找 pyspark 中的范围。
解决方案
对于 Pyspark 1.6+:使用非 equi 连接来查找匹配范围。values
然后,由于范围可能重叠,因此您将拥有比最初更多的行,按值分组并调用collect_list
。
我添加了一个不在范围内的值的示例。如果您不关心它们,请更改数据框的连接方式left
。
ranges = spark.createDataFrame(((1, 0, 5), (2, 4, 7), (3, 8, 10)),
schema=("index", "from", "to"))
values = spark.createDataFrame(((-1,), (3,), (5,), (8,), (100,)),
schema=("value",))
df2 = ranges.join(values,
values.value.between(ranges["from"], ranges["to"]),
how="right") # change to left outliers should be ignored
df2.groupBy("value").agg(collect_list("index").alias("range_indices")).show()
# +-----+-------------+
# |value|range_indices|
# +-----+-------------+
# | 5| [1, 2]|
# | 100| []|
# | 3| [1]|
# | 8| [3]|
# | -1| []|
# +-----+-------------+
推荐阅读
- python - 在 python 3 中将 pdf 文件读取到文本文件,但会生成类似 AttributeError: 'PDFObjRef' object has no attribute 'decode' 的错误
- css - HTML表格布局中的中心内容
- android - 在Android中更改图像填充颜色
- c++ - 未实现赋值运算符时调用构造函数
- reactjs - 如何从另一个 React / ReactNative 组件触发 GraphQL 查询
- c# - 应用程序:应用程序启动器,无法移动目录,它正被另一个进程使用
- reactjs - 有什么方法可以防止用户在浏览器中通过 document.cookie 修改 cookie?
- angular - Angular 2 创建状态页面并在没有哈希的情况下访问
- python - 使用 Python 解析 JSON 中的 unicode 字符
- java - 如果找不到@Named,则使用匕首的默认实现