gpt4 book ai didi

python - 为什么在使用范围连接提示时会出现异常?

转载 作者:行者123 更新时间:2023-12-03 17:13:56 24 4
gpt4 key购买 nike

我正在尝试使用 DataFrame.hint()添加 Range Join hint 的方法加入我。

我有两张 table :minutesevents .

分钟表有 minute_startminute_end自固定时刻以来以秒为单位的时间列。当然,它们的值是 60 的倍数。

事件表有类似 event_startevent_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 ,我得到了异常(exception):
AnalysisException: 'Range join hint: invalid arguments Buffer(60);'

当我尝试通过 60 时在作为数字而不是字符串的提示中,它提示提示的参数必须是字符串。

我是 不在 Azure ,但我希望结果是一样的。

有没有人遇到过类似的问题并找到了解决方案或知道我在哪里犯了错误?

更新 1

(目前,我正在 Databricks Runtime 6.1、Python 3.7.3、Spark 2.4.4 上尝试它)

我以为我错过了参数是可迭代的,所以我再次尝试,使用 events.hint("range_join", [60]) .关于参数不是字符串的同样提示: TypeError: all parameters should be str, got 60 of type <class 'int'> .

我想知道 Databricks 的 Spark 版本是否落后。

这是在 Spark source code on GitHub :

def hint(self, name, *parameters):
... (no checks on `parameters` up to here)

allowed_types = (basestring, list, float, int)
for p in parameters:
if not isinstance(p, allowed_types):
raise TypeError(
"all parameters should be in {0}, got {1} of type {2}".format(
allowed_types, p, type(p)))

... (no checks beyond this point)

所以一个列表 int s 应该被允许。

我得到的是 all parameters should be str ,但 GitHub 版本会说 all parameters should be in (basestring, list, float, int)如果我传递了错误类型的参数。

更新 2
hint("skew", "col_name")似乎正在工作。

最佳答案

我在 GitHub 上检查了 Spark 源代码。
Version 2.4.4有这个:

def hint(self, name, *parameters):
... # no checks on `parameters` up to here

for p in parameters:
if not isinstance(p, str):
raise TypeError(
"all parameters should be str, got {0} of type {1}".format(p, type(p)))

... # no checks beyond here
但来自 version 3.0.0-preview-rc1上,来源是这样的:
def hint(self, name, *parameters):
... # no checks on `parameters` up to here

allowed_types = (basestring, list, float, int)
for p in parameters:
if not isinstance(p, allowed_types):
raise TypeError(
"all parameters should be in {0}, got {1} of type {2}".format(
allowed_types, p, type(p)))

... # no checks beyond here
因此,似乎 2.4.4 版有一个错误,该错误已在 3.0.0-preview-rc1 开始的版本中得到修复。

关于python - 为什么在使用范围连接提示时会出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56242674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com