Spark Dataframe 区分具有重复名称的列

149

据我所知,在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中,是否有办法重新区分重复命名的列?或者有没有一些方法可以让我更改列名?

12个回答

0

对我有用的是

import databricks.koalas as ks

df1k = df1.to_koalas()
df2k = df2.to_koalas()
df3k = df1k.merge(df2k, on=['col1', 'col2'])
df3 = df3k.to_spark()

除了col1和col2之外,所有列的名称都会在其末尾添加“_x”(如果它们来自df1)或“_y”(如果它们来自df2),这正是我所需要的。

0

Pyspark 3.2.1 +

我发现在Spark 3.2.1中使用toDF可以简单地实现这一点。

df.show()
+------+------+---------+
|number|  word|     word|
+------+------+---------+
|     1| apple|   banana|
|     2|cherry|     pear|
|     3| grape|pineapple|
+------+------+---------+

df = df.toDF(*[val + str(i) for i, val in enumerate(df.columns)])

df.show()
+-------+------+---------+
|number0| word1|    word2|
+-------+------+---------+
|      1| apple|   banana|
|      2|cherry|     pear|
|      3| grape|pineapple|
+-------+------+---------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接