首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在带约束的Apache Spark (Scala)数据框中将布尔列转换为数值列?

在带约束的Apache Spark (Scala)数据框中将布尔列转换为数值列?
EN

Stack Overflow用户
提问于 2017-11-01 02:28:52
回答 3查看 9.3K关注 0票数 3
代码语言:javascript
复制
 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中是否有一个函数可以将Spark数据帧的整列的true值转换为1,并将false转换为0

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

代码语言:javascript
复制
 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的函数。

感谢任何形式的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-01 02:54:52

代码语言:javascript
复制
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

代码语言:javascript
复制
val bool2int_udf = udf(bool2int _)

val tempfile =inputfile.select("a","b","c").withColumn("c",bool2int_UDF($("c")))
票数 1
EN

Stack Overflow用户

发布于 2018-07-26 04:49:56

您不需要使用udf来做到这一点。如果要将布尔值转换为int,可以将列的类型转换为int

代码语言:javascript
复制
val df2 = df1
  .withColumn("boolAsInt",$"bool".cast("Int")
票数 10
EN

Stack Overflow用户

发布于 2017-11-03 02:41:36

下面的代码对我很有效。@Achyuth的答案提供了部分函数。然后,从这个问题中获得想法:我能够使用UDF将Achyuth答案中的函数应用于数据框的完整列。下面是完整的代码。

代码语言:javascript
复制
 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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47042278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档