Spark DataFrame и переименование нескольких столбцов (Java)

Есть ли лучший способ префикса или переименовать все или несколько столбцов одновременно с данным SparkSQL DataFrame, чем вызывать несколько раз dataFrame.withColumnRenamed()?

Примером может быть, если я хочу обнаружить изменения (используя полное внешнее соединение). Затем я остаюсь с двумя DataFrame с той же структурой.

Ответ 1

Я предлагаю использовать метод select() для этого. На самом деле методColumnRenamed() использует select() сам по себе. Вот пример, как переименовать несколько столбцов:

import org.apache.spark.sql.functions._

val someDataframe: DataFrame = ...

val initialColumnNames = Seq("a", "b", "c")
val renamedColumns = initialColumnNames.map(name => col(name).as(s"renamed_$name"))
someDataframe.select(renamedColumns : _*)

Ответ 2

Я думаю, что этот метод может помочь вам.

public static Dataset<Row> renameDataFrame(Dataset<Row> dataset) {
    for (String column : dataset.columns()) {
        dataset = dataset.withColumnRenamed(column, SystemUtils.underscoreToCamelCase(column));
    }
    return dataset;
}

    public static String underscoreToCamelCase(String underscoreName) {
        StringBuilder result = new StringBuilder();
        if (underscoreName != null && underscoreName.length() > 0) {
            boolean flag = false;
            for (int i = 0; i < underscoreName.length(); i++) {
                char ch = underscoreName.charAt(i);
                if ("_".charAt(0) == ch) {
                    flag = true;
                } else {
                    if (flag) {
                        result.append(Character.toUpperCase(ch));
                        flag = false;
                    } else {
                        result.append(ch);
                    }
                }
            }
        }
        return result.toString();
    }



Ответ 3

Я только что нашел ответ

df1_r = df1.select(*(col(x).alias(x + '_df1') for x in df1.columns))

at fooobar.com/questions/295185/... (см. конец принятого ответа)

Ответ 4

or (a <- 0 to newsales.columns.length - 1) 
{ 
 var new_c = newsales.columns(a).replace('(','_').replace(')',' ').trim  
 newsales_var = newsales.withColumnRenamed(newsales.columns(a),new_c) 
}

Ответ 5

Хотя он не отвечает на ваш вопрос напрямую, но я всегда обновляю имена столбцов один за другим. Поскольку он обновляет только метаданные DF, нет никакого вреда (без влияния на производительность) при обновлении имен столбцов один за другим, например:

for c in DF.columns:
    new_c = c.strip().replace(' ','_')
    DF = DF.withColumnRenamed(c, new_c)