2017-10-31 1 views
0
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の値を1に、false0に変換する関数がSparkにありますか?制約付きのApache Spark(Scala)データフレームのブール型列を数値列に変換しますか?

私は、次の(出典: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") 

を:PySparkためCasting a new derived column in a DataFrame from boolean to integerの答えが、私は特にスカラ座のための機能を望んでいました。

どのようなヘルプにも感謝します。

答えて

1
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"))) 
+0

こんにちは@Achyuth、この問題を調べていただきありがとうございます。しかし、これは機能しません。 Bool2intは 'bool'を引数として取り込む関数ですが、' org.apache.spark.sql.Column'を引数として必要としました。 – Learner

0

が私のために働いたとして、上記の関数を使用して登録します。 @ 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") 
関連する問題