Spark DataFrame和重命名多个列(Java)

15

有没有比多次调用dataFrame.withColumnRenamed()更好的方法来同时给给定的SparkSQL DataFrame的所有或多个列添加前缀或重命名?

例如,如果我想要检测变化(使用全外连接)。然后我得到两个具有相同结构的DataFrame

4个回答

19

我建议使用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 : _*)

这更多关于Java API和Spark。举个例子,select需要一个String参数,然后是可变参数或者Column数组,这不一致并且有时使用起来有些烦人。我不得不创建一些辅助方法来解决这个问题,但最好是直接在DataFrame中提供这些方法。 - JiriS
这里还有另一个例子:https://dev59.com/rlwY5IYBdhLWcg3wh4Aq - Myles Baker
你尝试过在Spark 2.0上运行你的代码吗?我正在处理7000列,参见https://github.com/ramhiser/datamicroarray/wiki/Golub-(1999)。这需要很长时间(=在我的耐心耗尽之前永远无法完成)。 - Boern
1
@JiriS,你有这个的Java版本吗?还是我们必须坚持使用withColumnRenamed方法? - Asiri Liyana Arachchi

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




你从哪里导入 SystemUtils - Max Goodridge
自定义,我添加了。 - Alsace

0

我刚刚找到了答案

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

这里的Stack Overflow(请见被采纳的答案的末尾)


0
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) 
}

2
请添加更多信息。我们不鼓励仅包含代码和“尝试此方法”的答案,因为它们没有可搜索的内容,并且没有解释为什么有人应该“尝试此方法”。我们在这里努力成为知识资源。 - abarisone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接