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

请问Flink 中是否可以在 json_query 函数的 path 中使用变量,例如 ?

请问Flink 中是否可以在 json_query 函数的 path 中使用变量,例如 select json_query( col_a, col_b) from table_a 报错 Caused by: org.apache.flink.table.planner.codegen.CodeGenException: Unsupported call: JSON_QUERY(STRING, STRING, SYMBOL NOT NULL, SYMBOL NOT NULL, SYMBOL NOT NULL) If you think this function should be supported, you can create an issue and start a discussion for it. 但是path 使用固定的串, 就可以执行 select json_query( col_a, '$') from table_a

展开
收起
真的很搞笑 2023-07-03 15:27:03 149 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在 Flink 中,json_query 函数是用于从 JSON 字符串中查询特定数据的函数。它的语法如下:

    Copy
    json_query(jsonStr, path)
    其中,jsonStr 是要查询的 JSON 字符串,path 是查询路径,可以是一个字符串字面量或者一个表达式。在 path 中,可以使用点号(.)来访问 JSON 对象的属性,也可以使用方括号([])来访问 JSON 数组的元素。

    在 Flink 中,json_query 函数的 path 参数不支持直接使用变量。但是可以通过字符串拼接和替换的方式来实现类似的功能。例如,可以使用 concat 函数和 replace 函数来动态构造查询路径。示例如下:

    less
    Copy
    -- 动态构造查询路径
    SET @path = concat('$.', 'field', '.', 'subfield');
    -- 替换查询路径中的变量
    SELECT json_query(jsonStr, replace(@path, '?', 'value')) FROM myTable;
    在上面的示例中,首先使用 concat 函数将查询路径动态构造出来,然后使用 replace 函数将查询路径中的占位符(?)替换成实际的变量值(value)。最后,使用 json_query 函数查询指定字段的值。

    2023-07-30 09:39:14
    赞同 展开评论 打赏
  • 在 Flink 中,json_query 函数的 path 参数需要是一个固定的字符串值,不能直接使用变量。这意味着您无法在 json_query 函数的 path 中动态地引用表达式或变量。

    报错信息中提到了不支持带有符号的 JSON_QUERY 调用,这是因为 Flink 目前不支持将变量作为 json_query 函数的 path 参数进行解析和执行。

    如果您想在 json_query 函数中使用动态路径,可以考虑使用 Flink 的 UDF(User-Defined Function)功能来实现自定义的查询逻辑。通过编写自己的 UDF,并将其应用于查询语句中,您可以实现更灵活的路径查询操作。

    以下是一个示例:

    import org.apache.flink.table.functions.ScalarFunction;
    
    public class JsonQueryUDF extends ScalarFunction {
        public String eval(String json, String path) {
            // 在这里编写自己的 JSON 查询逻辑,使用 path 参数来动态获取对应的结果
            // 返回查询结果
        }
    }
    

    然后,在您的 Flink SQL 查询中,可以使用该自定义 UDF:

    SELECT JsonQueryUDF(col_a, col_b) FROM table_a;
    

    这样,您可以自定义处理 JSON 查询逻辑,并在查询中根据需要传递变量参数来执行动态的路径查询。

    请注意,以上代码仅为示例,请根据实际需求进行修改和调整。具体的自定义 UDF 实现可能需要根据您的数据结构和查询需求而有所不同。

    2023-07-30 09:40:21
    赞同 展开评论 打赏
  • 存在即是合理

    flink中可以在json_query函数的path中使用变量。例如,可以使用以下语法:

    SELECT json_query(col_a, '$.key') FROM table_a;
    

    其中,'$.key'是一个字符串,表示JSON对象中的一个键名。如果您想使用变量来动态指定键名,可以使用以下语法:

    SELECT json_query(col_a, '${key}') FROM table_a;
    

    其中,'${key}'是一个占位符,表示要替换为实际值的变量。在运行时,flink会将变量替换为实际值,并执行查询操作。

    2023-07-05 17:17:20
    赞同 展开评论 打赏

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

相关产品

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

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