Spark SQL: есть ли способ различать столбцы с одинаковыми именами? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть CSV с заголовком со столбцами с тем же именем.

Я хочу обработать их с помощью spark, используя только SQL, и иметь возможность однозначно ссылаться на эти столбцы.

Ex:.

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

Я хочу получить только имя столбца, используя только Spark SQL

1 Ответ

1 голос
/ 04 апреля 2019

Как упоминалось в комментариях, я думаю, что менее подверженным ошибкам методом было бы изменить схему входных данных.

Тем не менее, если вы ищете быстрый обходной путь, вы можете просто проиндексировать дублированные имена столбцов.

Например, давайте создадим фрейм данных с тремя 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|
+----+---+----+---+----+
...