Apache spark Spark-Word计数替代方法

Apache spark Spark-Word计数替代方法,apache-spark,word-count,Apache Spark,Word Count,我有一百万行, 除了将每个单词映射为1然后按键减少的传统方法外,还有没有其他方法可以在spark中实现单词计数 传统方法: JavaPairRDD<String, Integer> counts = textFile.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator()) .mapToPair(s -> new Tuple2<>(s, 1)

我有一百万行, 除了将每个单词映射为1然后按键减少的传统方法外,还有没有其他方法可以在spark中实现单词计数

传统方法:

JavaPairRDD<String, Integer> counts = textFile.flatMap(s -> 
                         Arrays.asList(SPACE.split(s)).iterator())
        .mapToPair(s -> new Tuple2<>(s, 1))
        .reduceByKey((a, b) -> a + b);
javapairdd counts=textFile.flatMap(s->
Arrays.asList(SPACE.split(s)).iterator()
.mapToPair(s->new Tuple2(s,1))
.reduceByKey((a,b)->a+b);

有什么新方法吗

当然有很多方法可以做到这一点。这里有两个:

一:平面图和数据框:

JavaRDD<Row> rowRdd = spark.read()
        .textFile("loremipsum.txt")
        .javaRDD()
        .flatMap(s -> Arrays.asList(s.split(" ")).iterator())
        .map(s -> RowFactory.create(s));
spark.createDataFrame(rowRdd,
                      new StructType()
                     .add(DataTypes.createStructField("word", DataTypes.StringType, true)))
      .groupBy("word")
      .count()
      .show();
好处:使用SQL进行分组(如果这算是另一种选择的话)

二:按字分组并计算iterables中的元素:

Map<String, Long> counts = spark.read().textFile("loremipsum.txt")
        .javaRDD()
        .flatMap(s -> Arrays.asList(s.split(" ")).iterator())
        .groupBy(i -> i)
        .aggregateByKey(0L, (id, it) -> countIterable(it), (a, b) -> a + b)

        .collect() //collection of Tuple2: you can stop here
        .stream()
        .collect(Collectors.toMap(t -> t._1, t -> t._2));
countIterable
定义为:

private static <T> long countIterable(Iterable<T> it) {
    long res = 0;
    for (T t : it)
        res += 1;
    return res;
}

当然有很多方法可以做到这一点。这里有两个:

一:平面图和数据框:

JavaRDD<Row> rowRdd = spark.read()
        .textFile("loremipsum.txt")
        .javaRDD()
        .flatMap(s -> Arrays.asList(s.split(" ")).iterator())
        .map(s -> RowFactory.create(s));
spark.createDataFrame(rowRdd,
                      new StructType()
                     .add(DataTypes.createStructField("word", DataTypes.StringType, true)))
      .groupBy("word")
      .count()
      .show();
好处:使用SQL进行分组(如果这算是另一种选择的话)

二:按字分组并计算iterables中的元素:

Map<String, Long> counts = spark.read().textFile("loremipsum.txt")
        .javaRDD()
        .flatMap(s -> Arrays.asList(s.split(" ")).iterator())
        .groupBy(i -> i)
        .aggregateByKey(0L, (id, it) -> countIterable(it), (a, b) -> a + b)

        .collect() //collection of Tuple2: you can stop here
        .stream()
        .collect(Collectors.toMap(t -> t._1, t -> t._2));
countIterable
定义为:

private static <T> long countIterable(Iterable<T> it) {
    long res = 0;
    for (T t : it)
        res += 1;
    return res;
}

导入需要的包,如“org.apache.spark.sql.functions.*”

斯卡拉:

val strDF = spark.read.text("test.txt")
strDF.select(explode(split(col("line")," ")).as("word")).groupBy(col("word")).count.show
爪哇:

String filePath=“/test.txt”;
数据集行=sparkSession.read().text(filePath.toDF(“行”);
行。选择(分解(拆分(列(“行”),”).as(“字”)).groupBy(“字”).count().show();

导入所需的包,如“org.apache.spark.sql.functions.*”

斯卡拉:

val strDF = spark.read.text("test.txt")
strDF.select(explode(split(col("line")," ")).as("word")).groupBy(col("word")).count.show
爪哇:

String filePath=“/test.txt”;
数据集行=sparkSession.read().text(filePath.toDF(“行”);
行。选择(分解(拆分(列(“行”),”).as(“字”)).groupBy(“字”).count().show();

您是否对这种方法有问题,或者您只是好奇地想看到替代方案?我很好奇地想看到替代方案,在面试中遇到了这个问题。您是对这种方法有问题,还是只是好奇地想看到替代方案?我很好奇地想看到替代方案,采访中遇到这个问题。Map wordCountRdd=sparkContext.textFile(“D:\\Data\\ApacheSpark\\Data\\Crickete.txt”).flatMap(x->Arrays.asList(x.split(“,”).iterator()).countByValue();Map wordCountRdd=sparkContext.textFile(“D:\\Data\\ApacheSpark\\Data\\Crickete.txt”).flatMap(x->Arrays.asList(x.split(“,”).iterator()).countByValue();