我有一个csv,其中的标头包含相同名称的列。
我想仅使用SQL使用spark处理它们,并且能够明确引用这些列。
例如:
id name age height name
1 Alex 23 1.70
2 Joseph 24 1.89
我只想使用Spark SQL来获取名字列
答案 0 :(得分:1)
如评论中所述,我认为不太容易出错的方法是更改输入数据的架构。
但是,如果您正在寻找一种快速的解决方法,则只需索引重复的列名即可。
例如,让我们创建一个包含三个id
列的数据框。
val df = spark.range(3)
.select('id * 2 as "id", 'id * 3 as "x", 'id, 'id * 4 as "y", 'id)
df.show
+---+---+---+---+---+
| id| x| id| y| id|
+---+---+---+---+---+
| 0| 0| 0| 0| 0|
| 2| 3| 1| 4| 1|
| 4| 6| 2| 8| 2|
+---+---+---+---+---+
然后,我可以使用toDF
设置新的列名。让我们考虑一下,我知道只有id
是重复的。如果我们不这样做,那么添加额外的逻辑来找出要重复的列就不会很困难。
var i = -1
val names = df.columns.map( n =>
if(n == "id") {
i+=1
s"id_$i"
} else n )
val new_df = df.toDF(names : _*)
new_df.show
+----+---+----+---+----+
|id_0| x|id_1| y|id_2|
+----+---+----+---+----+
| 0| 0| 0| 0| 0|
| 2| 3| 1| 4| 1|
| 4| 6| 2| 8| 2|
+----+---+----+---+----+