Я пытаюсь использовать метод DataFrame.hint () для добавления подсказки Range Join к моему соединению.
У меня есть две таблицы: minutes
и events
.
В таблице минут есть столбцы minute_start
и minute_end
, которые представляют собой время в секундах с фиксированного момента времени.Естественно, их значения кратны 60.
Таблица событий имеет похожие столбцы event_start
и event_end
, только для событий.События могут начинаться и заканчиваться в любую секунду.
Для каждого события мне нужно найти все минуты, с которыми оно перекрывается.
Я пробую это на Databricks (время выполнения 5.1, Python 3.5):
# from pyspark.sql.types import StructType, StructField, IntegerType
# minutes = spark.sparkContext\
# .parallelize(((0, 60),
# (60, 120)))\
# .toDF(StructType([
# StructField('minute_start', IntegerType()),
# StructField('minute_end', IntegerType())
# ]))
# events = spark.sparkContext\
# .parallelize(((12, 33),
# (0, 120),
# (33, 72),
# (65, 178)))\
# .toDF(StructType([
# StructField('event_start', IntegerType()),
# StructField('event_end', IntegerType())
# ]))
events.hint("range_join", "60")\
.join(minutes,
on=[events.event_start < minutes.minute_end,
minutes.minute_start < events.event_end])\
.orderBy(events.event_start,
events.event_end,
minutes.minute_start)\
.show()
Без вызова hint
результат будет ожидаемым:
+-----------+---------+------------+----------+
|event_start|event_end|minute_start|minute_end|
+-----------+---------+------------+----------+
| 0| 120| 0| 60|
| 0| 120| 60| 120|
| 12| 33| 0| 60|
| 33| 72| 0| 60|
| 33| 72| 60| 120|
| 65| 178| 60| 120|
+-----------+---------+------------+----------+
С hint
я получу исключение:
AnalysisException: 'Range join hint: invalid arguments Buffer(60);'
Когда я попытался передать подсказку 60
в виде числа, а не строки, он пожаловался, что параметром подсказки должна быть строка.
Я не в Azure, но я ожидаю, что результат будет таким же.
Кто-нибудь сталкивался с подобной проблемой и нашел решение, или знает, где я делаю ошибку?