Apache spark 如何降低数据框列名的大小写,但不降低其值的大小写?

Apache spark 如何降低数据框列名的大小写,但不降低其值的大小写?,apache-spark,apache-spark-sql,apache-spark-dataset,Apache Spark,Apache Spark Sql,Apache Spark Dataset,如何降低数据框列名的大小写,但不降低其值的大小写?使用原始的Spark SQL和Dataframe方法 输入数据框(假设我有100个大写的列) 塔吉特数据帧 name | country | src | city | debit ------------------------------------------------ "foo"| "NZ" | salary | "Auckland" | 15.0 "bar"| "Aus" | investme

如何降低数据框列名的大小写,但不降低其值的大小写?使用原始的Spark SQL和Dataframe方法

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

塔吉特数据帧

name | country | src        | city       | debit
------------------------------------------------
"foo"| "NZ"    | salary     | "Auckland" | 15.0
"bar"| "Aus"   | investment | "Melbourne"| 12.5
这个怎么样:

一些虚假数据:

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
。请注意,我没有运行此翻译

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

import org.apache.spark.sql.functions._
df.select(df.columns.map(x => col(x).as(x.toLowerCase)): _*).show(false)
from pyspark.sql import functions as F
df.select([F.col(x).alias(x.lower()) for x in df.columns]).show()
如果您使用的是pyspark,您可以简单地执行以下操作

import org.apache.spark.sql.functions._
df.select(df.columns.map(x => col(x).as(x.toLowerCase)): _*).show(false)
from pyspark.sql import functions as F
df.select([F.col(x).alias(x.lower()) for x in df.columns]).show()

Java8
将列名转换为小写的解决方案

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

您可以在python中为spark dataframe使用df.WithColumnRename(col_name,col_name.lower())我正在寻找一个原始的sql解决方案,主要像
sparkSession.sql(“查询”)
@Ramesh Maharjan如何使用Java编写它?谢谢Ramesh。特别是给两个语法。它首先帮助了我使用Python版本,现在我必须用scala重写所有代码(用于生产级目的),因此scala版本也非常受欢迎,因为OP要求使用“原始sql”,为什么不选择这个作为答案?我觉得这是最接近OP要求的。