【问题标题】:NTILE function not working in Spark SQL 1.5NTILE 函数在 Spark SQL 1.5 中不起作用
【发布时间】: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


【解决方案1】:

如果您使用Window.partitionBy("id").orderBy("sum_val"),则您将按id 分组,并且在您应用ntile 函数之后。因此,通过这种方式,每个组都有一个元素,ntile 为每个id 应用相同的值。

为了实现您的第一个结果,您需要删除 partitionBy("id") 并仅使用 Window.orderBy("sum_val")

这就是我修改您的代码的方式:

val w = Window.orderBy("sum_val")
val resultDF = x.orderBy("sum_val").select( x("id"),x("sum_val"), ntile(4).over(w) )

这是resultDF.show()的打印:

+---+-------+-----+ | id|sum_val|ntile| +---+-------+-----+ | B| 3| 1| | E| 4| 1| | H| 4| 2| | D| 14| 2| | A| 14| 3| | F| 30| 3| | C| 34| 4| +---+-------+-----+

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2016-07-08
    • 2017-05-21
    相关资源
    最近更新 更多