flinksql你们用过中位数函数吗?各位大佬,如果要求中位数怎么实现呢,有没有相关的内置函数,还是说可以自定义开发一个udf来实现?可以实现的是吧?会不会运行很长时间之后对结果有影响,select id, company, salary from(select id, company, salary, cast(row_number() over(partition by company order by salary asc, id asc) as signed) as 'id1', cast(row_number() over(partition by company order by salary desc, id desc) as signed) as 'id2' from employee) as newtable where abs(id1-id2)=1 or id1=id2;你看看这个sql能不能实现,同一个字段,降序升序,然后取相等的,还是建议写自定义可以实现是吧,别人写的,我看看哪个方式合适
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
Flink SQL 中目前没有内置的中位数函数,但是可以通过自定义 UDF 或者使用 Flink 的内置函数库来实现中位数计算。
一种实现中位数计算的方法是利用 Flink 的窗口函数和排序函数,具体步骤如下:
使用窗口函数将所有数据分组并排序,得到有序数据集。
计算数据集的总长度。
如果数据集长度为偶数,则取中间两位数据的平均数作为中位数。
如果数据集长度为奇数,则取中间一位数据作为中位数。
下面是一个示例 SQL 语句,用于计算 salary 列的中位数:
sql
Copy
SELECT AVG(salary)
FROM (
SELECT salary, ROW_NUMBER() OVER (ORDER BY salary) AS rn, COUNT() OVER () AS cnt
FROM my_table
) t
WHERE rn IN (FLOOR((cnt+1)/2), FLOOR((cnt+2)/2))
上述 SQL 语句使用了 ROW_NUMBER() 函数和 COUNT() OVER() 函数来对数据集进行排序和计数,并使用 FLOOR() 函数来计算中位数的位置。最后,使用 AVG() 函数计算中位数的值。
在 Flink SQL 中,目前没有内置的中位数函数。但是,您可以使用自定义的 UDF(User-Defined Function)来实现中位数的计算。
以下是一个示例,展示了如何通过自定义 UDF 来计算中位数:
1. 首先,定义一个继承自 ScalarFunction
的中位数 UDF:
import org.apache.flink.table.functions.ScalarFunction;
public class MedianUDF extends ScalarFunction {
public double eval(Object[] arr) {
Arrays.sort(arr);
int len = arr.length;
if (len % 2 == 0) {
return ((double) arr[len / 2 - 1] + (double) arr[len / 2]) / 2;
} else {
return (double) arr[len / 2];
}
}
}
2. 在 Flink SQL 中注册并使用该 UDF:
-- 注册 UDF
CREATE FUNCTION median_udf AS 'com.example.MedianUDF';
-- 使用 UDF 计算中位数
SELECT median_udf(salary) as median_salary
FROM employee;
在上述示例中,我们创建了一个名为 MedianUDF
的 UDF,用于计算中位数。然后使用 CREATE FUNCTION
语句将该 UDF 注册到 Flink SQL 中,最后在查询中使用 median_udf
函数来计算中位数。
需要注意的是,这只是一个简单的示例,适用于小规模数据集。对于大规模数据集,可能需要考虑分布式计算和更高效的算法来计算中位数。
关于您提供的 SQL 语句,它在一定情况下可以实现中位数的计算,但是需要注意该查询是在有序分区中运行,并且返回 id1
和 id2
相等或相差1的记录。然而,该查询可能会消耗较长的时间和资源,特别是在数据量大的情况下。因此,自定义的 UDF 可能更适合用于中位数的
自定义,就求数组长度的二分之一取整所在索引,对应的数据,你搞这么复杂干嘛呢,先排序,再二分之一所在索引就行了 ,这种应该是数据是奇数个的时候才能这样吧,偶数个就不行 ,此回答整理自钉群“【③群】Apache Flink China社区”
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。