【发布时间】:2016-03-21 04:01:21
【问题描述】:
我正在像这样的简单数据集上测试 NTILE 函数:
(id:字符串,值:double)
10
B 3
C 4
D 4
E 4
F 30
C 30
D 10
4
H 4
对 HIVE 运行以下查询(在 MapReduce 上)
SELECT tmp.id, tmp.sum_val, NTILE(4) OVER (ORDER BY tmp.sum_val) AS quartile FROM (SELECT id, sum(value) AS sum_val FROM testntile GROUP BY id) AS tmp
工作正常,结果如下:
(id, sum_val, 四分位数)
B 3 1
H 4 1
E 4 2
D 14 2
14 3
F 30 3
C 34 4
对 Hive on Spark (v 1.5) 运行相同的查询仍然可以正常工作。
对 Spark SQL 1.5 (CDH 5.5.1) 运行相同的查询
val result = sqlContext.sql("SELECT tmp.id, tmp.sum_val, NTILE(4) OVER (ORDER BY tmp.sum_val) AS quartile FROM (SELECT id, sum(value) AS sum_val FROM testntile GROUP BY id) AS tmp")
result.collect().foreach(println)
我得到以下错误结果:
[B,3.0,0]
[E,4.0,0]
[H,4.0,0]
[A,14.0,0]
[D,14.0,0]
[F,30.0,0]
[C,34.0,0]
重要提示:结果不是确定性的,因为“有时”会返回正确的值
直接在数据帧上运行相同的算法
val x = sqlContext.sql("select id, sum(value) as sum_val from testntile group by id")
val w = Window.partitionBy("id").orderBy("sum_val")
val resultDF = x.select( x("id"),x("sum_val"), ntile(4).over(w) )
仍然返回错误的结果。
我做错了吗?有任何想法吗?提前感谢您的回答。
【问题讨论】:
-
我无法重现该问题。关于 DataFrame 上的最后一个查询,它是不一样的。
-
您好,谢谢您的回复。在最后一个示例中,我并没有尝试执行完全相同的查询。相反,我试图通过 1.4 版中引入的低级 Spark Window 函数来获得相同的结果(不幸的是,在这种情况下最终结果也是错误的:-/)。
标签: apache-spark apache-spark-sql quantile