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 没有别名的主要内容,如果未能解决你的问题,请参考以下文章