如何在java中打印spark rdd的最高值?

5vf7fwbs  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(577)

我正在做一个练习,要求我对一个有1300多万行的文件进行一些“过滤”,下面是一个示例:

18;03;2015;082XX S MOZART ST;THEFT;$500 AND UNDER;STREET;41.743803922;-87.693687357
19;03;2015;052XX S CORNELL AVE;ROBBERY;ARMED: HANDGUN;RESIDENCE PORCH/HALLWAY;41.80061868;-87.585887262
19;03;2015;020XX N PULASKI RD;CRIMINAL DAMAGE;TO VEHICLE;STREET;41.918320523;-87.726596048
18;03;2015;001XX W RANDOLPH ST;ASSAULT;SIMPLE;RESIDENCE;41.884472382;-87.633378182

我要问的问题是:
-犯罪率最高的一天-平均犯罪率最高的月份-犯罪率逐年上升?
我想知道如何打印/过滤最高和最新版本。。。我将在这里插入我的代码(在这里我已经插入了我的其他问题):

Public class Main {
public static void main (String [] args) {
    System.out.println("Start");
    SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("Pratic Spark");
    JavaSparkContext sc = new JavaSparkContext(conf);
    JavaRDD<String> arquivo = sc.textFile("hdfs://localhost/Frameworks/spark/ocorrencias_criminais.csv");

    /* --- EXERCÍCIO 1 ---- Filters colun nº 2 from dataset - YEAR ----*/ 
    JavaRDD<String> YearRDD  = arquivo.map(s -> 
    {String[] fields= s.split(";") ; 
    return fields[2];
    });
    // print results
    System.out.println("Answer to question 1 -> " + YearRDD.countByValue());

    /* ---- EXERCÍCIO 2 ---- Filters "Narcotics" type from colun nº 4 ----*/
    JavaRDD<String> JustNarcotics = arquivo.filter(s -> {
        String [] fields = s.split(";");
        String type = campos [4];
        return type.equalsIgnoreCase("NARCOTICS");
    });
    /* ---- EXERCÍCIO 2 ---- Filter by year ---- EXERCÍCIO 2 ---- */ 
    JavaRDD<String> YearByNarcoticsRDD = JustNarcotics.map(s -> {
        String [] fields = s.split(";");
        return fields[2];

    });
    //Prints the result ---- EXERCÍCIO 2 ----         
    System.out.println("Answer to the question 2 -> " + AnoporNarcoticsRDD.countByValue());

// ---- EXERCÍCIO 3 ---- Aplying filter for even days ---- 
        JavaRDD<String> EvenDayRDD = arquivo.filter(s -> {
        String [] fields= s.split(";");   
        String type = fields[4];
        int day = Integer.valueOf(fields[0]);
        return(type.equalsIgnoreCase("NARCOTICS")&&(day % 2 == 0));
        });

    JavaRDD<String> EvenDaysRDD = EvenDayMapRDD.map(s -> {
         String [] fields= s.split(";");
        return fields[0];
    });
    //prints the result ---- EXERCÍCIO 3 ----         
    System.out.println("Awswer to the question 3 -> " + EvenDayMapRDD.countByValue());

谢谢!
ps:上面的代码可能有些错误,它是葡萄牙语的,但我翻译了它以便更好地理解。它工作得很好。
ps2:我还没有为我提到的问题做任何事情(最高和平均)。这是我第一次用java和spark编程,这样我就可以使用一些帮助,即使是这些“基础”的东西。

gcmastyq

gcmastyq1#

正如这里所回答的,如何使用两个“条件”过滤Spark?
将数据rdd转换为Dataframe。一旦有了Dataframe,一切都会变得更简单。

Dataset<Row> summary = crimeInfoDataset.groupBy("year", "month", "day", "crimeType").count().toDf("year", "month", "day", "crimeType", "count");

找到每月的最高犯罪率。

summary.groupBy("month").max("count").show(false);

找到每天的最高犯罪率。

summary.groupBy("day").max("count").show(false);

按犯罪类型找出最大犯罪率。

summary.groupBy("crimeType").max("count").show(false);

按月份和年份找出最大犯罪率。

summary.groupBy("month", "year").max("count").show(false);

根据您的要求,将最大值替换为平均值、最小值和类似值。

相关问题