如何降低数据框的列名但不降低其值?

时间:2018-02-07 23:28:05

标签: 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

taget dataframe

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

4 个答案:

答案 0 :(得分:2)

如果您使用 scala ,则可以执行以下操作

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

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

forEach

答案 1 :(得分:2)

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 :(得分:1)

这个怎么样:

一些假数据:

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

答案 3 :(得分:0)

您可以将df.withColumnRenamed(col_name,col_name.lower())用于python中的spark数据帧