PySpark Self Join 没有别名

Posted

技术标签:

【中文标题】PySpark Self Join 没有别名【英文标题】:PySpark Self Join without alias 【发布时间】:2021-12-23 17:37:08 【问题描述】:

我有一个 DF,我想 left_outer 加入自己,但我想用 pyspark api 而不是别名。

所以它是这样的:

df = ...
df2 = df

df.join(df2, [df['SomeCol'] == df2['SomeOtherCol']], how='left_outer')

有趣的是,这是不正确的。当我运行它时,我得到了这个错误:

WARN Column: Constructing trivially true equals predicate, 'CAMPAIGN_ID#62L = CAMPAIGN_ID#62L'. Perhaps you need to use aliases.

有没有办法在不使用别名的情况下做到这一点?还是使用别名的干净方式? Alias 确实让代码更脏,而不是直接使用 pyspark api。

【问题讨论】:

这能回答你的问题吗? Spark SQL performing carthesian join instead of inner join 【参考方案1】:

使用别名最简洁的方式如下。

给定以下数据框。

df.show()
+---+----+---+
| ID|NAME|AGE|
+---+----+---+
|  1|John| 50|
|  2|Anna| 32|
|  3|Josh| 41|
|  4|Paul| 98|
+---+----+---+

在下面的示例中,我只是在每个列名中添加“2”,以便每个列在连接后具有唯一的名称。

df2 = df.select([functions.col(c).alias(c + "2") for c in df.columns])

df = df.join(df2, on = df['NAME'] == df2['NAME2'], how='left_outer')

df.show()
+---+----+---+---+-----+----+
| ID|NAME|AGE|ID2|NAME2|AGE2|
+---+----+---+---+-----+----+
|  1|John| 50|  1| John|  50|
|  2|Anna| 32|  2| Anna|  32|
|  3|Josh| 41|  3| Josh|  41|
|  4|Paul| 98|  4| Paul|  98|
+---+----+---+---+-----+----+

如果我只是简单地做了一个df.join(df).select("NAME"),pyspark 不知道我要选择哪一列,因为它们都具有完全相同的名称。这将导致如下错误。

AnalysisException: Reference 'NAME' is ambiguous, could be: NAME, NAME.

【讨论】:

以上是关于PySpark Self Join 没有别名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL LEFT JOIN 中使用别名

pyspark:使用别名选择列

使用别名重命名 pyspark 列

pyspark-sql:打印表达式的别名

在 s3 pyspark 作业中创建单个镶木地板文件

pyspark 为自定义模块返回名为错误的无模块