我有一个带有相同名称列的标题的 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)