美文网首页
FlinkSql读取Map类型数据

FlinkSql读取Map类型数据

作者: 毛驴胡子 | 来源:发表于2021-07-31 13:44 被阅读0次
家楼顶

需求

源kafka消息数据中有个字段是Map类型, 我希望读取该字段并且写入clickhouse中, 这是个Map<String, Object>类型的数据, 还有可能是嵌套结构。就像这样

{
    "name":"hello",
    "info": {
        "age": 18,
        "gender": "male",
        "other": {
            "car": "川A8888888",
            "what": 100
        }
    }
}

问题

flinksql原生支持Map类型, 但是必须制定key和value的类型, 无法满足需求。所以打算以字符串的方式写入clickhouse, 查询的时候再解析, 于是我在sql定义中将map类型的数据类型写成String。就像这样

CREATE TABLE long_long_ago (
    name STRING,
    info STRING
) WITH (…)

可事情没有向预计的方向发展, 程序不报错, 可是写入到clickhouse中的info字段为空, 一脸懵逼, 开始进入正题。

方案

为什么将Map类型的数据定义成String后解析出来的数据是空呢?直接看代码, 不一会儿就定位到所在代码的位置了。

所在包:flink-json
所在类:org.apache.flink.formats.json.JsonRowDataDeserializationSchema
所在方法:convertToString
原因: 
  因为flink解析出来的info本质还是jsonNode, 即使我们在sql中定义其为String。     
  而jsonNode的asText方法是没实现的(也就是空)。
  所以适当的修改一下代码就可以了, jsonNode实现了toString类。

修改如下

private StringData convertToString(JsonNode jsonNode) {
   if (jsonNode.asText() == "") {
      return StringData.fromString(jsonNode.toString());
   } else {
      return StringData.fromString(jsonNode.asText());
   }
}

修改完上面的方法后, 打包flink-json包, 替换jar包。

好了, 现在flink程序就可以将Map对象转成String, 然后落地到clickhouse了

相关文章

  • FlinkSql读取Map类型数据

    需求 源kafka消息数据中有个字段是Map类型, 我希望读取该字段并且写入clickhouse中, 这是个Map...

  • Flink AsyncFunction导致的Kafka数据不消

    问题描述 flinksql从kafka读取数据,异步函数加载Mysql数据进行维表关联,最后将数据写入到mysql...

  • Spark常用函数总结和说明:

    1. textFile() 读取数据源,返回一个string类型的RDD, 举例: 2. map() 遍历每条数据...

  • Go 学习笔记 05 | map 详解

    一、map 详解 make 创建 map 类型的数据: 输出: for range 循环遍历 map 类型的数据。...

  • GO基础5-map

    map是引用类型 创建、初始化 for range 循环遍历map类型数据 map类型的CURD 定义一个map类...

  • Hive的复杂数据类型

    复杂数据类型:array、map、struct1.数组array,里边不能装不同类型的数据 2.map Map...

  • JavaScript数据处理

    后—>前 Map类型的Json数据 Map接口

  • go map

    map 值可以是任意类型, map键的数据类型必须是相同的,值的类型也是map是无序的

  • 字符串与流处理

    文件读取 把文件中的内容读取到map中 把map的内容导出到一个文件中 一次性读取所有内容 字符串类型转换 使用i...

  • 数据的读取与修改

    一.数据的读取 1.属性的读取:Parameters和Parameter Map(用的偏少) Parameters...

网友评论

      本文标题:FlinkSql读取Map类型数据

      本文链接:https://www.haomeiwen.com/subject/gczhvltx.html