【问题标题】:Spark DataFrame and renaming multiple columns (Java)Spark DataFrame 和重命名多列(Java)
【发布时间】:2016-01-06 01:35:46
【问题描述】:

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

如果我想检测更改(使用完全外连接),就是一个例子。然后我剩下两个具有相同结构的DataFrames。

【问题讨论】:

    标签: java apache-spark apache-spark-sql


    【解决方案1】:

    我建议使用 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 需要一个字符串参数,然后是可变参数或Columns 的数组,这不一致,有时使用起来也有点烦人。我必须创建一些辅助方法来处理这个问题,但最好让这些方法直接在DataFrame 中可用。
    • 还有一个例子here
    • 您是否使用 Spark 2.0 尝试过您的代码?我正在处理 7000 列,请参阅 github.com/ramhiser/datamicroarray/wiki/Golub-(1999) 。这需要很长时间(=在我的耐心结束之前从未完成)。
    • @JiriS 你有这个的java版本吗?还是我们必须坚持使用 withColumnRenamed 方法?
    【解决方案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
    • 自定义,我添加了
    【解决方案3】:

    我已经找到答案了

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

    stackoverflow here(见已接受答案的结尾)

    【讨论】:

      【解决方案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) 
      }
      

      【讨论】:

      • 请编辑更多信息。不鼓励使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
      猜你喜欢
      • 2021-12-18
      • 2016-06-06
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2018-08-23
      相关资源
      最近更新 更多