【问题标题】:Apply same function to all fields of spark dataframe row将相同的功能应用于火花数据框行的所有字段
【发布时间】:2015-12-02 08:22:33
【问题描述】:

我有大约 1000 列(可变)列的数据框。

我想让所有值都大写。

这是我想到的方法,你能建议这是否是最好的方法。

  • 排队
  • 查找架构并存储在数组中,然后查找其中有多少字段。
  • 映射数据框中的每一行,并达到数组中元素数量的限制
  • 将函数应用于大写每个字段并返回行

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    如果您只是想对所有列应用相同的功能,这样就足够了:

    import org.apache.spark.sql.functions.{col, upper}
    
    val df = sc.parallelize(
      Seq(("a", "B", "c"), ("D", "e", "F"))).toDF("x", "y", "z")
    df.select(df.columns.map(c => upper(col(c)).alias(c)): _*).show
    
    // +---+---+---+
    // |  x|  y|  z|
    // +---+---+---+
    // |  A|  B|  C|
    // |  D|  E|  F|
    // +---+---+---+
    

    或在 Python 中

    from pyspark.sql.functions import col, upper
    
    df = sc.parallelize([("a", "B", "c"), ("D", "e", "F")]).toDF(("x", "y", "z"))
    df.select(*(upper(col(c)).alias(c) for c in df.columns)).show()
    
    ##  +---+---+---+
    ##  |  x|  y|  z|
    ##  +---+---+---+
    ##  |  A|  B|  C|
    ##  |  D|  E|  F|
    ##  +---+---+---+
    

    另请参阅:SparkSQL: apply aggregate functions to a list of column

    【讨论】:

    • 谢谢这是在做什么用英文 .alias(c)): _*
    • alias 为列设置名称。 :_* 表示 Scala 中的可变参数语法。换句话说,它将序列的每个元素作为select 的参数传递。
    • 收到此错误File "<ipython-input-10-bd092d3f0048>", line 1 pivoted.select(pivoted.columns.map(c => encodeUDF(col(c)).alias(c)): _*).show(2) ^ SyntaxError: invalid syntax
    【解决方案2】:

    我需要做类似的事情,但必须编写自己的函数来将数据帧中的空字符串转换为 null。这就是我所做的。

    import org.apache.spark.sql.functions.{col, udf} 
    import spark.implicits._ 
    
    def emptyToNull(_str: String): Option[String] = {
      _str match {
        case d if (_str == null || _str.trim.isEmpty) => None
        case _ => Some(_str)
      }
    }
    val emptyToNullUdf = udf(emptyToNull(_: String))
    
    val df = Seq(("a", "B", "c"), ("D", "e ", ""), ("", "", null)).toDF("x", "y", "z")
    df.select(df.columns.map(c => emptyToNullUdf(col(c)).alias(c)): _*).show
    
    +----+----+----+
    |   x|   y|   z|
    +----+----+----+
    |   a|   B|   c|
    |   D|  e |null|
    |null|null|null|
    +----+----+----+
    

    这里有一个更精细的 emptyToNull 函数,它使用选项而不是 null。

    def emptyToNull(_str: String): Option[String] = Option(_str) match {
      case ret @ Some(s) if (s.trim.nonEmpty) => ret
      case _ => None
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多