如何将数据框的列名转换为小写,但不影响其值?

14

如何在不改变数据框中的值的情况下,将数据框列名的大小写降低?使用原始的Spark SQL和Dataframe方法。

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

NAME | COUNTRY | SRC        | CITY       | DEBIT
---------------------------------------------
"foo"| "NZ"    | salary     | "Auckland" | 15.0
"bar"| "Aus"   | investment | "Melbourne"| 12.5

目标数据框

name | country | src        | city       | debit
------------------------------------------------
"foo"| "NZ"    | salary     | "Auckland" | 15.0
"bar"| "Aus"   | investment | "Melbourne"| 12.5
5个回答

31

如果你正在使用scala,你只需要简单地执行以下操作

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

如果你正在使用pyspark,你可以简单地执行以下操作

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

我正在寻找一个原始的 SQL 解决方案,主要类似于 sparkSession.sql("query") - user1870400
@Ramesh Maharjan 怎样用Java写呢? - Curious Techie
谢谢你,Ramesh。特别是给出两种语法。这对我在 Python 版本上有所帮助,现在我需要将所有代码重写为 Scala(用于生产级别的目的),所以 Scala 版本也非常受欢迎。 - Mehdi LAMRANI

8

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

2
这样怎么样:
一些虚假数据:
scala> val df = spark.sql("select 'A' as AA, 'B' as BB")
df: org.apache.spark.sql.DataFrame = [AA: string, BB: string]

scala> df.show()
+---+---+
| AA| BB|
+---+---+
|  A|  B|
+---+---+

现在重新选择所有列,名称为它们的小写版本:

scala> val cols = df.columns.map(c => s"$c as ${c.toLowerCase}")
cols: Array[String] = Array(AA as aa, BB as bb)

scala> val lowerDf = df.selectExpr(cols:_*)
lowerDf: org.apache.spark.sql.DataFrame = [aa: string, bb: string]

scala> lowerDf.show()
+---+---+
| aa| bb|
+---+---+
|  A|  B|
+---+---+

注意:我使用的是Scala语言。如果你使用PySpark并不熟悉Scala语法,那么df.columns.map(c => s"$c as ${c.toLowerCase}")在Python中为map(lambda c: c.lower(), df.columns)cols:_*则变成了*cols。请注意,我没有运行这个翻译。


为什么这个回答没有被选为最佳答案,因为OP正在寻求“原始SQL”?我认为这是最接近OP所要求的。 - panc

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

0

你可以在Python中使用df.withColumnRenamed(col_name, col_name.lower())来对Spark DataFrame进行列重命名。


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