这与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.;"
答案 0 :(得分:2)
这应该有效:
correct_cols = ['user','trackId','artistId','timestamp']
df = df.toDF(*correct_cols)