有没有比多次调用dataFrame.withColumnRenamed()
更好的方法来同时给给定的SparkSQL DataFrame
的所有或多个列添加前缀或重命名?
例如,如果我想要检测变化(使用全外连接)。然后我得到两个具有相同结构的DataFrame
。
有没有比多次调用dataFrame.withColumnRenamed()
更好的方法来同时给给定的SparkSQL DataFrame
的所有或多个列添加前缀或重命名?
例如,如果我想要检测变化(使用全外连接)。然后我得到两个具有相同结构的DataFrame
。
我建议使用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 : _*)
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我刚刚找到了答案
df1_r = df1.select(*(col(x).alias(x + '_df1') for x in df1.columns))
在这里的Stack Overflow(请见被采纳的答案的末尾)
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)
}
select
需要一个String参数,然后是可变参数或者Column
数组,这不一致并且有时使用起来有些烦人。我不得不创建一些辅助方法来解决这个问题,但最好是直接在DataFrame
中提供这些方法。 - JiriS