使用Java在flink中聚合JSON

使用Java在flink中聚合JSON,java,json,apache-flink,flink-streaming,Java,Json,Apache Flink,Flink Streaming,我正在从文件中读取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-p

我正在从文件中读取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);
                });

有可能从弗林克那里提取这样的数据吗??我没有看到任何使用Java处理JSON的示例。感谢您的时间

您可以将json字符串解析为对象,即通过jackson library,并像往常一样操作一个java对象流

您可以将json字符串解析为对象,即通过jackson library,并像往常一样操作一个java对象流

您可以使用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 );
}

您可以使用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值。我该怎么做呢?如果你选择正则表达式选项,你可以使用一个映射,你可以在答案中使用这个函数,你可以让它取paramName并根据需要返回该param的计数或其值。如果你有一个非常大的Json文件,无法放入内存,你需要逐行读取,正则表达式会更好,另一种方法是使用Jackson将json加载到一个对象中,然后对其进行处理,这是一种更好的方法。我有很多方法来完成这项计数工作。有了这个,我只能计算
myparam3
。但除此之外,我还需要
myparam4
groupby值。我该怎么做呢?如果你选择正则表达式选项,你可以使用一个映射,你可以在答案中使用这个函数,你可以让它取paramName并根据需要返回该param的计数或其值。如果你有一个非常大的Json文件,无法放入内存,你需要逐行读取,正则表达式会更好,另一种方法是使用Jackson将json加载到对象中,然后对其进行处理,这是一种更好的方法