Spark SQL:有没有办法区分具有相同名称的列?

时间:2019-04-04 16:04:06

标签: sql apache-spark apache-spark-sql

我有一个csv,其中的标头包含相同名称的列。

我想仅使用SQL使用spark处理它们,并且能够明确引用这些列。

例如:

id name   age height name 
1  Alex   23  1.70 
2  Joseph 24  1.89

我只想使用Spark SQL来获取名字列

1 个答案:

答案 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|
+----+---+----+---+----+