如何降低数据框列名的大小写而不是其值?

use*_*400 10 apache-spark apache-spark-sql apache-spark-dataset

如何降低数据框列名的大小写而不是其值?使用 RAW Spark SQL 和 Dataframe 方法?

输入数据框(假设我有 100 个大写的这些列)

NAME | COUNTRY | SRC        | CITY       | DEBIT
---------------------------------------------
"foo"| "NZ"    | salary     | "Auckland" | 15.0
"bar"| "Aus"   | investment | "Melbourne"| 12.5
Run Code Online (Sandbox Code Playgroud)

目标数据框

name | country | src        | city       | debit
------------------------------------------------
"foo"| "NZ"    | salary     | "Auckland" | 15.0
"bar"| "Aus"   | investment | "Melbourne"| 12.5
Run Code Online (Sandbox Code Playgroud)

Ram*_*jan 25

如果您使用的是scala,则只需执行以下操作

import org.apache.spark.sql.functions._
df.select(df.columns.map(x => col(x).as(x.toLowerCase)): _*).show(false)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是pyspark,则只需执行以下操作

from pyspark.sql import functions as F
df.select([F.col(x).alias(x.lower()) for x in df.columns]).show()
Run Code Online (Sandbox Code Playgroud)


aba*_*hel 7

Java 8 将列名转换为小写的解决方案。

import static org.apache.spark.sql.functions.col;
import org.apache.spark.sql.Column;

df.select(Arrays.asList(df.columns()).stream().map(x -> col(x).as(x.toLowerCase())).toArray(size -> new Column[size])).show(false);
Run Code Online (Sandbox Code Playgroud)


Art*_*pov 1

对于Java 8

Dataset<Row> input;
for (StructField field : input.schema().fields()) {
   String newName = field.name().toLowerCase(Locale.ROOT);
   input = input.withColumnRenamed(field.name(), newName);
   if (field.dataType() instanceof StructType) {
       StructType newStructType = (StructType) StructType.fromJson(field.dataType().json().toLowerCase(Locale.ROOT));
       input = input.withColumn(newName, col(newName).cast(newStructType));
   }
}
Run Code Online (Sandbox Code Playgroud)