在Scala Spark中
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 :(得分:3)
尝试:
sqlContext.sql(
"select avg(case when id=0 then null else id end), avg(id) from df"
).show
答案 1 :(得分:1)
要选择非零值,请使用where子句,如
sqlContext.sql("select avg(x) from df where x >0").show
我得到的回应是
+---+
|_c0|
+---+
|2.0|
+---+
答案 2 :(得分:1)
您也可以在没有sql语句的情况下尝试:
<强>爪哇:强>
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();
<强> Scala的:强>
df.filter(df("x")>0 || df("x")<0)
.select(avg("x"))
.show