【问题标题】:How to lower the case of column names of a data frame but not its values?如何降低数据框的列名而不是其值的大小写?
【发布时间】:2018-07-18 09:44:51
【问题描述】:

如何降低数据框列名的大小写而不是其值?使用 RAW 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

【问题讨论】:

    标签: apache-spark apache-spark-sql apache-spark-dataset


    【解决方案1】:

    如果你使用的是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")
    • @Ramesh Maharjan 如何使用 Java 编写它?
    • 谢谢拉梅什。尤其是同时给出两种语法。它首先帮助我使用了 Python 版本,现在我必须在 scala 中重写我的所有代码(用于生产级目的)所以 Scala 版本也非常受欢迎
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      这个怎么样:

      一些假数据:

      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 语法,那么在 Python 中df.columns.map(c => s"$c as ${c.toLowerCase}") 是map(lambda c: c.lower(), df.columns),cols:_* 会变成*cols。请注意我没有运行这个翻译。

      【讨论】:

      • 为什么没有选择这个作为答案,因为 OP 要求“原始 sql”?我觉得这是最接近 OP 所要求的。
      【解决方案4】:

      您可以在 python 中使用 df.withColumnRenamed(col_name,col_name.lower()) 作为 spark 数据框

      【讨论】:

        猜你喜欢
        • 2020-01-31
        • 2021-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多