有没有办法区分两个具有相同名称的列(非联接)

时间:2019-02-09 17:43:38

标签: apache-spark pyspark

这与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 个答案:

答案 0 :(得分:2)

这应该有效:

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