【问题标题】:Spark is not able to resolve the columns correctly when joins data frames连接数据帧时,Spark 无法正确解析列
【发布时间】: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.AVGYTDdata_to_mergedays_currencies_matrix 是完全不同的数据帧时是可以的。在您的情况下,您创建了其中一个,对另一个使用了一些转换,因此出现错误消息...

标签: dataframe apache-spark join pyspark databricks


【解决方案1】:

我发现了问题。

第一个select() 大约是next_df。事实上,在第一种情况下,我使用连接数据框名称引用列,这些名称不在最终结果中。

在第二个代码中,我使用join 分配给它们的名称正确地引用了列,这些是正确的名称。

顺便说一句:

这也有效:

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')

next_df = next_df.select(next_df.AVGYTD, next_df.AVGWEEK, next_df.ENDMTH)


  

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2021-11-07
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多