开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

请教下,我自定义了一个 UDF,Flink这个是为什么? 有办法优化么?

SELECT
JSON_VALUE(evt, '$._from') AS _from,
JSON_VALUE(evt, '$._to') AS _to,
FROM
(
SELECT
udf_foo (paramA, paramB) AS evt
FROM
(
VALUES
('AAAA', 'BBBB')
) AS t (paramA, paramB)
) sub

请教下,我自定义了一个 UDF,但是我发现在这样的写法里面 udf_foo 会被调用两次
Flink这个是为什么? 有办法优化么?

展开
收起
cuicuicuic 2023-09-13 17:12:30 39 0
1 条回答
写回答
取消 提交回答
  • 在您提供的查询语句中,确实会发现 UDF udf_foo 被调用两次的情况。这是由于 Flink SQL 的查询优化过程导致的。

    Flink SQL 查询优化器在执行查询时,通常会对查询计划进行优化,包括表达式的重写、冗余计算的消除等。在您的查询中,查询优化器可能会对子查询进行优化,导致 UDF udf_foo 被调用两次。

    为了优化这种情况,您可以尝试将 UDF 的结果存储在一个临时表中,然后在外层查询中引用该临时表。这样可以避免重复计算,提高查询性能。例如:
    ```CREATE TEMPORARY TABLE tmp_table AS
    SELECT udf_foo(paramA, paramB) AS evt
    FROM (VALUES ('AAAA', 'BBBB')) AS t(paramA, paramB);

    SELECT
    JSON_VALUE(evt, '$._from') AS _from,
    JSON_VALUE(evt, '$._to') AS _to
    FROM tmp_table;

    ```

    通过将计算结果存储在临时表中,查询优化器可以更好地优化查询计划,并避免多次调用 UDF。

    另外,您还可以检查 UDF udf_foo 的实现,确保它没有任何副作用和不必要的重复计算。合理设计和实现 UDF 可以提高查询性能。

    需要注意的是,Flink SQL 查询优化器的具体行为取决于 Flink 版本和配置。如果您仍然遇到性能问题,建议查看 Flink 的官方文档和相关资源,了解更多关于查询优化和性能调优的建议。

    2023-09-20 15:58:41
    赞同 展开评论 打赏

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

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载