Каков наилучший способ поиска списка целых чисел в списке ранжированных целых чисел в pyspark - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть список диапазонов, как показано ниже:

list of ranges

У меня есть список значений, как показано ниже:

enter image description here

Теперь, что мне нужно сделать, для каждого значения в «Списке значений» мне нужно получить индекс строки в «Списке диапазонов»таким образом, что значение находится между «От» и «До» этой строки в «Списке диапазонов».

Допущения:

  • Оба списка являются фреймами данных (Iпредпочел бы, чтобы это был pyspark)
  • В «Списке диапазонов» могут быть наложения, в этом случае возвращаются все возможные индексы диапазона
  • Значения From и To являются Inclusive
  • «Список диапазонов» может иметь более 100 миллионов строк
  • Длина «Списка значений» всегда будет меньше, чем «Список диапазонов». (Даже если на моем рисунке это не показано)

Объясняя вышеприведенное с примером,

Первый элемент в «Списке значений» - «17», а диапазон дозначение которого находится в индексе 2 «Списка диапазонов», а 17 находится в диапазоне от 15 до 19.

Вторым элементом в «Списке значений» является «51», и диапазон, в который он попадает, будетбыть в индексе 9 «Списка диапазонов», так как 51 находится между 50 и 54.

Я хотел бы, если есть какой-либо быстрый / эффективный способ поиска диапазонов в pyspark.

1 Ответ

0 голосов
/ 11 декабря 2019

Это должно работать на Spark 2.1 +:

import pyspark.sql.functions as F

df_ranges = df_ranges.withColumn("id", F.monotonically_increasing_id())
df = df_vals.crossJoin(df_ranges)
df = df.where((F.col('val') >= F.col('from')) & (F.col('value') <= F.col('to')))
df = df.groupby('val').agg(F.collect_set('id').alias('ids'))
df.show()

        +------+-----------+
        |   val|        ids|
        +------+-----------+
        |    17|        [2]|
        |    51|        [9]|
        +------+-----------+
...