【发布时间】:2022-01-27 10:10:19
【问题描述】:
我在 Databricks 上使用 pyspark(python 3.8)而不是 spark3.0。运行此 DataFrame 连接时:
next_df = (
days_currencies_matrix.alias("a")
.join(
data_to_merge.alias("b"),
[
days_currencies_matrix.dt == data_to_merge.RATE_DATE,
days_currencies_matrix.CURRENCY_CODE == data_to_merge.CURRENCY_CODE,
],
"LEFT",
)
.select(
days_currencies_matrix.CURRENCY_CODE,
days_currencies_matrix.dt.alias("RATE_DATE"),
data_to_merge.AVGYTD,
data_to_merge.ENDMTH,
data_to_merge.AVGMTH,
data_to_merge.AVGWEEK,
data_to_merge.AVGMTD,
)
)
我收到了这个错误:
列 AVGYTD#67187、AVGWEEK#67190、ENDMTH#67188、AVGMTH#67189、AVGMTD#67191 不明确。这可能是因为您将几个 Dataset 连接在一起,并且其中一些 Dataset 是相同的。此列指向其中一个数据集,但 Spark 无法确定是哪一个。请在加入之前通过
Dataset.as为具有不同名称的数据集起别名,并使用限定名称指定列,例如df.as("a").join(df.as("b"), $"a.id" > $"b.id")。您还可以将 spark.sql.analyzer.failAmbiguousSelfJoin 设置为 false 以禁用此检查。
这告诉我以上列属于多个数据集。为什么会这样?代码告诉准确触发源数据帧; 此外,days_currencies_matrix 只有 2 列:dt 和 CURRENCY_CODE。
源数据帧定义如下:
currencies_in_merging_data = data_to_merge.select('CURRENCY_CODE').distinct()
days_currencies_matrix = dt_days.crossJoin(currencies_in_merging_data)
是不是因为 days_currencies_matrix DataFrame 实际上是建立在 data_to_merge 之上的?这与惰性评估有关还是一个错误?
顺便说一句,这个版本没有问题:
next_df = (
days_currencies_matrix.alias("a")
.join(
data_to_merge.alias("b"),
[
days_currencies_matrix.dt == data_to_merge.RATE_DATE,
days_currencies_matrix.CURRENCY_CODE == data_to_merge.CURRENCY_CODE,
],
"LEFT",
)
.select(
col("a.dt").alias("RATE_DATE"),
col("a.CURRENCY_CODE"),
col("b.AVGYTD"),
col("b.ENDMTH"),
col("b.AVGMTH"),
col("b.AVGWEEK"),
col("b.AVGMTD"),
)
)
【问题讨论】:
-
错误非常明显。 Spark 说在调用列时应该使用别名。这就是您的代码的第二个版本有效的原因。你正在做的正是 spark 需要你做的事情。
-
我投票结束这个问题,因为 OP 正在完全按照错误消息中的说明解决问题中的问题。
-
@Steven: data_to_merge.AVGYTD 还不够吗?
-
只需使用
col("b.AVGYTD"), -
@ozw1z5rd
data_to_merge.AVGYTD当data_to_merge和days_currencies_matrix是完全不同的数据帧时是可以的。在您的情况下,您创建了其中一个,对另一个使用了一些转换,因此出现错误消息...
标签: dataframe apache-spark join pyspark databricks