flinksql你们用过中位数函数吗?各位大佬,如果要求中位数怎么实现呢,有没有相关的内置函数,还是

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能不能实现,同一个字段,降序升序,然后取相等的,还是建议写自定义可以实现是吧,别人写的,我看看哪个方式合适

展开
收起
真的很搞笑 2023-07-03 15:12:05 360 分享 版权
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    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() 函数计算中位数的值。

    2023-07-30 09:39:45
    赞同 展开评论
  • 在 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 可能更适合用于中位数的

    2023-07-30 09:41:23
    赞同 展开评论
  • 自定义,就求数组长度的二分之一取整所在索引,对应的数据,你搞这么复杂干嘛呢,先排序,再二分之一所在索引就行了 ,这种应该是数据是奇数个的时候才能这样吧,偶数个就不行 ,此回答整理自钉群“【③群】Apache Flink China社区”

    2023-07-03 15:33:04
    赞同 展开评论

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

还有其他疑问?
咨询AI助理