Spark SQL:有没有办法区分同名列



我有一个带有相同名称列的标题的 csv。

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

前任。:

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

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

如评论中所述,我认为不太容易出错的方法是更改输入数据的模式。

但是,如果您正在寻找快速解决方法,只需索引列的重复名称即可。

例如,让我们创建一个包含三列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|
+----+---+----+---+----+
def renaming_dup_colm(df):
    new_col_list=[]
    for col in df.columns:
        if col not in new_col_list:
            new_col_list.append(col)
        else:
            col = f"{col}_dup1"
            new_col_list.append(col)
    df = df.toDF(*new_col_list)
    return df
df = renaming_dup_colm(df)

最新更新