有没有办法区分同名的两列(非连接)

Posted

技术标签:

【中文标题】有没有办法区分同名的两列(非连接)【英文标题】:Is there a way to distinguish two columns with the same name (non-join) 【发布时间】:2019-02-09 17:43:37 【问题描述】:

这与join name duplication 的问题相似,但无法使用相同的技术来解决,因为所有技术都依赖于如何提前规避或准备问题。

因此,在为我的团队准备培训材料时,我添加了一条警告,关于重命名列以使用与另一个列相同的名称,以及 spark 将如何愉快地让您这样做,而您最终会得到...

AnalysisException: Reference 'a' is ambiguous, could be: a#1333L, a#1335L.

...当你尝试df.select('a')

所以很明显你应该首先避开问题或修复代码并在它发生时重新运行它,但让我们想象一下假设情况:

您(在笔记本中以交互方式)处理一组将长时间计算的转换并缓存结果。只有在您开始使用缓存的结果之后,您才意识到您打错了字并最终得到了两个具有相同名称的列。修复很简单,但是重新计算需要很长时间,你的老板正指着手表等待结果...

你是做什么的?

有没有办法修复列名?我可以df.collect() 将数据放入 python 并在那里修复它们并重新创建 DF,但数据很大并且它会杀死驱动程序。我假设您可以降到 RDD 级别并修复它,但我的 RDD 知识非常有限,我不确定是否可以这样。有什么想法吗?

以下是可能导致问题的示例代码:

df.printSchema()
root
 |-- user: integer (nullable = true)
 |-- trackId: integer (nullable = true)
 |-- artistId: integer (nullable = true)
 |-- timestamp: long (nullable = true)

df.withColumnRenamed('timestamp','user').printSchema()
root
 |-- user: integer (nullable = true)
 |-- trackId: integer (nullable = true)
 |-- artistId: integer (nullable = true)
 |-- user: long (nullable = true)


df.withColumnRenamed('timestamp','user').select('user')
AnalysisException: u"Reference 'user' is ambiguous, could be: user#134, user#248L.;"

【问题讨论】:

非常好的问题! 【参考方案1】:

这应该可行:

correct_cols = ['user','trackId','artistId','timestamp']
df = df.toDF(*correct_cols)

【讨论】:

以上是关于有没有办法区分同名的两列(非连接)的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 标准:如何通过连接的两列排序?

Amazon Redshift:连接列内容略有不同的两列

连接单独处理的火花数据帧的两列时的顺序保证是啥?

连接熊猫数据框中的两列

连接来自两个不同表的两列

连接具有相同标题但在不同表中的两列