2017-10-23 5 views
1

Spark Dataframeには、2列のテーブルが含まれています。 ステータス、カテゴリ。sparkデータフレームでgroupByを適用した後のフィルタリングされた列の割合

Status has values----'y' and 'n' 
Category has values -'a', 'b' and 'c' 

spark(Scala)の各カテゴリでステータス「y」のパーセンテージを見つける方法はありますか? 私はこれまでできることができます。

df.groupBy("category").agg(count("*")) 
df.filter(col("status")==="y").groupBy("category").count() 

その組み合わせは何がエラー

答えて

0
val dfN = df.filter(col("status").equalTo("y")) 

enter image description here

val dfSum = dfN.groupBy("category").agg(count("status").as("Sum")) 
val numSum = num.first()(0).toString.toInt 

val dfResult = dfSum.select(col("category"), lit(col("Sum") * 100/numSum).as("percentage")) 

enter image description here

+0

役立つことを願うヴァルnumSum = num.first()(0).toString.toIntは、あなたがNUMとはどういう意味ですか? – bestie

+0

df内のステータス "y"の発生回数をカウントしています。私の例では、4の値が得られます。 –

+0

var num = df.groupBy( "category").gg(count( "*"))でなければなりません。私は、各カテゴリの 'y'の割合が0であっても、 – bestie

0

GroupByaggregationがそれぞれのcountを見つけるのに十分でなければならない私を与えた後、個々CategoryのそれぞれStatusWindow関数を使用して、の合計sumを見つけることができます。そして最後に、filterを計算して、必要なStatusを出すことができます。

import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.expressions.Window 

def windowSpec = Window.partitionBy("Category") 
val tempdf = df.groupBy("Status", "Category").agg(count("Category").as("ind_count")) 
       .withColumn("tot_count", sum("ind_count").over(windowSpec)) 

    tempdf.filter($"Status" === "y").select($"Status", $"Category", (($"ind_count"/$"tot_count")*100).as("y_percentage")).show(false) 

私は、答えはこの行で

+0

構文エラーを取得中です。私は輸入品を持っています。私はtoreeでApacheを実行しています。 – bestie

+0

構文エラーは何ですか? –

+0

def windowSpec = Window.partitionBy( "Category")この行を追加すると、エラーが発生します。 apache toreeがこのエラーのスタックトレースを出力していません。名前:構文エラー。 メッセージ: StackTrace: – bestie

関連する問題