2016-05-31 79 views
1

在斯卡拉星火星火SQL平均非零值

val df = sc.parallelize(0 to 3).toDF("x") 
df.registerTempTable("df") 

sqlContext.sql("select * from df").show 
+---+ 
| x| 
+---+ 
| 0| 
| 1| 
| 2| 
| 3| 
+---+ 

,並想只平均非零值。試過這個(不起作用),

sqlContext.sql("select avg(nullif(x,0)) from df").show 

什麼是簡單和有效的方法來平均非零值?

+0

我猜NULLIF不星火SQL 支持 「org.apache.spark.sql.AnalysisException:未定義功能NULLIF;」 – RoyaumeIX

+0

嘗試檢查此線程:http://stackoverflow.com/questions/32357164/sparksql-how-to-deal-with-null-values-in-user-defined-function – RoyaumeIX

回答

3

嘗試:

sqlContext.sql(
    "select avg(case when id=0 then null else id end), avg(id) from df" 
).show 
1

要選擇非零值,有一個where子句像

sqlContext.sql("select avg(x) from df where x >0").show 

,我得到的是

+---+ 
|_c0| 
+---+ 
|2.0| 
+---+ 
1

你也可以試試這個響應沒有SQL語句:

的Java:

df.filter(df.col("x").gt(0).or(df.col("x").lt(0))) // x > 0 or x < 0 
    .select(org.apache.spark.sql.functions.avg("x")) // avg(x) 
    .show(); 

斯卡拉:

df.filter(df("x")>0 || df("x")<0) 
    .select(avg("x")) 
    .show