【问题标题】:PySpark Self Join without aliasPySpark Self Join 没有别名
【发布时间】: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。

【问题讨论】:

标签: python pyspark


【解决方案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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多