正如我在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}))
]
上面的结果是通过将数据框连接到自身来创建的,您可以看到 4
列同时包含两个 a
和 f
.
问题是,当我尝试使用 a
列进行更多计算时,我无法找到一种方法来选择 a
,我已经尝试了 df[0]
和 df.select('a')
,两者都返回了我的错误评论:
AnalysisException: Reference 'a' is ambiguous, could be: a#1333L, a#1335L.
Is there anyway in Spark API that I can distinguish the columns from the duplicated names again? or maybe some way to let me change the column names?
7 回答
假设您要加入的DataFrame是df1和df2,并且您要在列'a'上加入它们,那么您有2种方法
Method 1
这是一个很棒的方法,强烈建议 .
Method 2
在深入了解Spark API之后,我发现我可以先使用
alias
为原始数据帧创建别名,然后使用withColumnRename
手动重命名别名上的每一列,最后执行join
而不会导致列名重复 .更多细节可参考以下Spark Dataframe API:
pyspark.sql.DataFrame.alias
pyspark.sql.DataFrame.withColumnRenamed
However, I think this is only a troublesome workaround, and wondering if there is any better way for my question.
有一种比通过执行以下操作为所有列编写别名更简单的方法:
如果您加入的密钥在两个表中都相同,则此方法有效 .
见https://docs.databricks.com/spark/latest/faq/join-two-dataframes-duplicated-column.html
让我们从一些数据开始:
有几种方法可以解决这个问题 . 首先,您可以使用父列明确引用子表列:
您还可以使用表别名:
最后,您可以以编程方式重命名列:
我建议你更改
join
的列名结果
DataFrame
将schema
您可以使用
def drop(col: Column)
方法删除重复列,例如:当我用df2加入df1时,DataFrame将如下所示:
现在,我们可以使用
def drop(col: Column)
方法删除重复列'a'或'f',如下所示:这就是我们如何在PySpark中加入两个Dataframes on same column names .
如果在此之后执行
printSchema()
,则可以看到已删除重复的列 .