【问题标题】:Transform Boolean Column to Numerical Column in Apache Spark (Scala) data frame with constraints?在 Apache Spark (Scala) 数据框中使用约束将布尔列转换为数值列?
【发布时间】:2018-04-13 00:40:26
【问题描述】:
 val inputfile = sqlContext.read
        .format("com.databricks.spark.csv")
        .option("header", "true") 
        .option("inferSchema", "true") 
        .option("delimiter", "\t")
        .load("data")
 inputfile: org.apache.spark.sql.DataFrame = [a: string, b: bigint, c: boolean]
 val outputfile = inputfile.groupBy($"a",$"b").max($"c")

上面的代码失败,因为c 是一个布尔变量,聚合不能应用于布尔值。 Spark中是否有一个函数可以将true值转换为1false转换为0用于Spark数据框的整列。

我尝试了以下(来源:How to change column types in Spark SQL's DataFrame?

 val inputfile = sqlContext.read
        .format("com.databricks.spark.csv")
        .option("header", "true") 
        .option("inferSchema", "true") 
        .option("delimiter", "\t")
        .load("data")
 val tempfile =inputfile.select("a","b","c").withColumn("c",toInt(inputfile("c")))   
 val outputfile = tempfile.groupBy($"a",$"b").max($"c")

以下问题:Casting a new derived column in a DataFrame from boolean to integer PySpark 的答案,但我想要一个专门用于 Scala 的函数。

感谢任何形式的帮助。

【问题讨论】:

    标签: scala spark-dataframe


    【解决方案1】:

    您不需要使用 udf 来执行此操作。如果要将布尔值转换为int,可以将列类型转换为int

    val df2 = df1
      .withColumn("boolAsInt",$"bool".cast("Int")
    

    【讨论】:

      【解决方案2】:
      implicit def bool2int(b:Boolean) = if (b) 1 else 0
      
      scala> false:Int
      res4: Int = 0
      
      scala> true:Int
      res5: Int = 1
      
      scala> val b=true
      b: Boolean = true
      
      
      scala> 2*b+1
      res2: Int = 3
      

      使用上述函数并注册为UDF

      val bool2int_udf = udf(bool2int _)
      
      val tempfile =inputfile.select("a","b","c").withColumn("c",bool2int_UDF($("c")))
      

      【讨论】:

      • 嗨@Achyuth,感谢您调查此问题。但这不起作用。 Bool2int 是一个将bool 作为参数的函数,但我需要org.apache.spark.sql.Column 作为参数。
      【解决方案3】:

      以下代码对我有用。 @Achyuth 的回答提供了部分功能。然后,从这个问题中汲取灵感:Applying function to Spark Dataframe Column 我能够使用 UDF 将 Achyuth 答案中的函数应用于数据框的完整列。这是完整的代码。

       implicit def bool2int(b:Boolean) = if (b) 1 else 0
       val bool2int_udf = udf(bool2int _)
       val inputfile = sqlContext.read
              .format("com.databricks.spark.csv")
              .option("header", "true") 
              .option("inferSchema", "true") 
              .option("delimiter", "\t")
              .load("data") 
       val tempfile = inputfile.select("a","b","c").withColumn("c",bool2int_udf($"c"))
       val outputfile = tempfile.groupBy($"a",$"b").max($"c")
      

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 2013-09-15
        • 2021-06-09
        • 2020-02-09
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2020-04-01
        相关资源
        最近更新 更多