据我所知,在Spark Dataframe中,多个列可以具有相同的名称,如下面的数据框快照所示:
[
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=125231, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0047, 3: 0.0, 4: 0.0043})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=145831, f=SparseVector(5, {0: 0.0, 1: 0.2356, 2: 0.0036, 3: 0.0, 4: 0.4132})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=147031, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=149231, f=SparseVector(5, {0: 0.0, 1: 0.0032, 2: 0.2451, 3: 0.0, 4: 0.0042}))
]
上述结果是通过将一个数据框与其自身连接创建的,您可以看到其中有两个 a
和两个 f
的 4 列。
问题在于当我尝试使用 a
列进行更多计算时,我无法找到选择 a
的方法,我尝试了 df[0]
和 df.select('a')
,但都返回了以下错误信息:
AnalysisException: Reference 'a' is ambiguous, could be: a#1333L, a#1335L.
在Spark API中,是否有办法重新区分重复命名的列?或者有没有一些方法可以让我更改列名?
df2_r = **df2**.select(*(col(x).alias(x + '_df2') for x in df2.columns))
,而不是df2_r = df1.select(*(col(x).alias(x + '_df2') for x in df2.columns))
。其他都很好。 - Vzzarrdf1_a = df1.alias("df1_a")
,而不能直接使用df1
和df2
吗?这个回答没有解释为什么需要重命名以使得select('df1_a.f')
正常工作。 - Sheldoredf
与自身连接。也许如果写成df.alias("df1_a")
和df.alias("df2_a")
,解决方案会更有意义。 - timctran