【问题标题】:aggregation on JSON in flink using Java使用 Java 在 flink 中对 JSON 进行聚合
【发布时间】:2018-05-14 06:27:53
【问题描述】:

我正在从文件中读取 JSON 数据。

样本数据

{"name":"user1","myparam0":false,"myparam1":"44750004-23df-4960-88be-ba0884291597","myparam2":"36A3BF29-23df-EE2A-76B9-19BC1C854BA7","myparam3":"http://www.seloger.com/","myparam4":"http://www.seloger.com/erreur-temporaire/husk-pie","ver":"4.0.0"}
{"name":"user1","myparam0":true,"myparam1":"44750004-8bff-4960-88be-ba0884291597","myparam2":"36A3BF29-88be-EE2A-76B9-19BC1C854BA7","myparam3":"","myparam4":"http://www.seloger.com/erreur-temporaire/binde","ver":"4.0.0"}

我已经编写了一个示例代码来从文件中读取并将数据转换为这样的 JSON

DataStream<Object> input = env.readTextFile("file:///home/ravisankar/workspace/temporary/input.file")
                .map((line) -> {
                    return JSON.parseFull(line);
                });

现在我需要根据名称计算 15 秒内有多少 myparam3 为空。并按myparam4分组

Ex: {
  "user1": {
    "myparams3": 1,
    "myparam4": {
      "http://www.seloger.com/erreur-temporaire/binde": 1,
      "http://www.seloger.com/erreur-temporaire/husk-pie": 1
    }
  }
}

是否可以从 Flink 中提取这样的数据?我没有看到任何使用 Java 处理 JSON 的示例。感谢您的宝贵时间

【问题讨论】:

    标签: java json apache-flink flink-streaming


    【解决方案1】:

    您可以将您的 json 字符串解析为对象,即通过 jackson 库并照常操作 java 对象流

    【讨论】:

      【解决方案2】:

      您可以使用 jackson 将 json 解析为一个对象,然后循环计算您的元素

      private ObjectMapper objectMapper = new ObjectMapper() ;
      ...
      Object element = objectMapper.readValue( jsonString , Object.class );
      

      或者您可以使用匹配 "myparam3":"" 的正则表达式并计算匹配

      public static void main( String[] args ) throws IOException
      {
          String str = "{\"name\":\"user1\",\"myparam0\":false,\"myparam1\":\"44750004-23df-4960-88be-ba0884291597\",\"myparam2\":\"36A3BF29-23df-EE2A-76B9-19BC1C854BA7\",\"myparam3\":\"http://www.seloger.com/\",\"myparam4\":\"http://www.seloger.com/erreur-temporaire/husk-pie\",\"ver\":\"4.0.0\"}\r\n" + 
                  "{\"name\":\"user1\",\"myparam0\":true,\"myparam1\":\"44750004-8bff-4960-88be-ba0884291597\",\"myparam2\":\"36A3BF29-88be-EE2A-76B9-19BC1C854BA7\",\"myparam3\":\"\",\"myparam3\":\"\",\"myparam3\":\"\"\"myparam4\":\"http://www.seloger.com/erreur-temporaire/binde\",\"ver\":\"4.0.0\"}";
      
          Pattern pattern = Pattern.compile("\"myparam3\":\"\"");
      
      
          Matcher matcher = pattern.matcher(str);
      
          int count = 0;
          while (matcher.find()) {
              count++;
          }
          System.out.println("Matches found : " + count );
      }
      

      【讨论】:

      • 我有很多方法可以完成这项计数工作。有了这个我只能计数myparam3。但除此之外,我还需要 myparam4 groupby 值。我该怎么做??
      • 如果你选择正则表达式选项,你可以使用 Map 你可以在答案中使用这个函数,你可以让它接受 paramName 并返回该参数的计数或其值取决于您的需要
      • ps:如果你有一个非常大的 Json 文件不适合内存并且你需要逐行读取它,那么正则表达式会更好,否则将 json 加载到 Jackson 的对象中处理它,是一种更好的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2014-05-22
      • 1970-01-01
      • 2020-03-22
      相关资源
      最近更新 更多