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

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

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


person JiriS    schedule 08.10.2015    source источник


Ответы (4)


Я предлагаю использовать для этого метод select(). На самом деле метод withColumnRenamed() использует 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 : _*)
person Zyoma    schedule 23.11.2015
comment
Это больше о Java API и Spark. Например, select ожидает либо один параметр String, а затем varargs, либо массив Column, что не является согласованным, а также иногда немного раздражает в использовании. Мне пришлось создать несколько вспомогательных методов для решения этой проблемы, но было бы лучше иметь эти методы непосредственно доступными в DataFrame. - person JiriS; 24.11.2015
comment
Есть еще один пример здесь - person Myles Baker; 03.08.2016
comment
Вы пробовали свой код со Spark 2.0? Я имею дело с 7000 столбцов, см. github.com/ramhiser/datamicroarray/wiki /Голуб-(1999) . Это занимает вечность (= я никогда не заканчивал, пока мое терпение не закончилось). - person Boern; 07.02.2017
comment
@JiriS у вас есть Java-версия этого? или мы должны придерживаться метода withColumnRenamed? - person Asiri Liyana Arachchi; 09.04.2019

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

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();
    }



person Alsace    schedule 09.04.2019
comment
Откуда вы импортируете SystemUtils? - person Max Goodridge; 05.08.2019
comment
Пользовательский, я добавил - person Alsace; 07.08.2019

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

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

в stackoverflow здесь (см. конец принятого ответа)

person Community    schedule 17.03.2016

person    schedule
comment
Пожалуйста, отредактируйте с дополнительной информацией. Только для кода и попробуйте эти ответы не рекомендуется, потому что они не содержат контента для поиска и не объясняют, почему кто-то должен попробовать это. Мы прилагаем усилия здесь, чтобы быть источником знаний. - person abarisone; 22.06.2016