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

flink sql有没有函数支持解析一个json string并转成期望的数据类型呢?

flink sql有没有函数支持解析一个json string并转成期望的数据类型呢?
JSON_QUERY('{"a":[{"c":"c1"},{"c":"c2"}]}',
'lax $.a[].c')
这个内置函数返回的是string: '["c1","c2"]',而我期望返回的是ARRAY: ["c1","c2"]
所以期望的sql长这样
select parse_json( JSON_QUERY('{"a":[{"c":"c1"},{"c":"c2"}]}', 'lax $.a[
].c'), ARRAY) from dual;

展开
收起
cuicuicuic 2023-12-03 20:30:56 89 0
2 条回答
写回答
取消 提交回答
  • Apache Flink SQL目前还不支持直接解析JSON字符串并将其转换为预期的数据类型。你可以在Flink SQL中使用STRING_TO_ARRAY函数将字符串转换为数组。

    以下是一个示例,展示了如何将字符串转换为数组:

    SELECT STRING_TO_ARRAY(JSON_QUERY('{"a":[{"c":"c1"},{"c":"c2"}]}', 'lax $.a[].c'), ',') AS array_value FROM dual;
    

    在这个示例中,STRING_TO_ARRAY函数会将JSON_QUERY函数返回的字符串转换为数组。JSON_QUERY函数的第二个参数'lax $.a[].c'表示查询JSON对象中的a属性,并将结果展开为多个行。

    注意,这只是一个简单的示例,实际使用时可能需要根据你的具体需求进行修改。例如,你可能需要根据实际的数据类型和格式来修改JSON查询,或者根据实际的生产者和消费者数量来修改并行度。

    2023-12-04 16:27:22
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    Flink SQL 没有直接支持将 JSON 字符串解析为数组的内置函数。但是,你可以使用自定义函数来实现这个功能。以下是一个示例:

    1. 首先,创建一个自定义函数 parse_json,用于将 JSON 字符串解析为数组:
    import org.apache.flink.table.functions.ScalarFunction;
    import org.apache.flink.table.types.DataType;
    import org.apache.flink.table.types.logical.ArrayType;
    import org.apache.flink.table.types.logical.RowType;
    import org.apache.flink.table.types.utils.TypeConversions;
    import org.json.JSONArray;
    
    public class ParseJsonToArray extends ScalarFunction {
        private final DataType inputType;
        private final DataType outputType;
    
        public ParseJsonToArray(DataType inputType, DataType outputType) {
            this.inputType = inputType;
            this.outputType = outputType;
        }
    
        @Override
        public Object evaluate(Object value) throws Exception {
            String jsonStr = TypeConversions.toString(value);
            JSONArray jsonArray = new JSONArray(jsonStr);
            return jsonArray;
        }
    
        @Override
        public DataType getInputType() {
            return inputType;
        }
    
        @Override
        public DataType getResultType() {
            return outputType;
        }
    }
    
    1. 然后,在你的 Flink SQL 查询中使用这个自定义函数:
    SELECT parse_json(JSON_QUERY('{"a":[{"c":"c1"},{"c":"c2"}]}', 'lax $.a[].c'), ARRAY) FROM dual;
    

    这样,你就可以得到期望的结果:["c1","c2"]

    2023-12-03 21:42:23
    赞同 展开评论 打赏

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

相关产品

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

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