Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark中Hadoop等价物的文本、字节可写、文本可写?_Apache Spark - Fatal编程技术网

Apache spark Spark中Hadoop等价物的文本、字节可写、文本可写?

Apache spark Spark中Hadoop等价物的文本、字节可写、文本可写?,apache-spark,Apache Spark,各位亲爱的成员:, 正如我们所知,Hadoop的文本数据类型使用UTF-8编码。也就是说,如果字符可以存储在字节中,它将存储在字节中。如果一个字符不能存储在一个字节中,那么它将存储在2个字节中。同样,作为性能提升,对于Hadoop映射阶段的字计数程序,对于映射器值数据类型,如果可以使用ByteWritable,那么映射器输出数据的数量可以减少。IntWritable需要4个字节,而ByteWritable需要1个字节。如果我使用VIntWritable而不是IntWritable,那么如果整数可

各位亲爱的成员:, 正如我们所知,Hadoop的文本数据类型使用UTF-8编码。也就是说,如果字符可以存储在字节中,它将存储在字节中。如果一个字符不能存储在一个字节中,那么它将存储在2个字节中。同样,作为性能提升,对于Hadoop映射阶段的字计数程序,对于映射器值数据类型,如果可以使用ByteWritable,那么映射器输出数据的数量可以减少。IntWritable需要4个字节,而ByteWritable需要1个字节。如果我使用VIntWritable而不是IntWritable,那么如果整数可以存储在一个字节中,它将存储在一个字节中,否则它将存储在4个字节中,从而减少内存占用

如何修改下面的Java程序,使mapper的键类型为Text,值为ByteWritable,reducer的键类型为Text,值为VIntWritable

// Now we have non-empty lines, lets split them into words
JavaRDD<String> words = nonEmptyLines.flatMap(new FlatMapFunction<String, String>() {
  @Override
  public Iterable<String> call(String s) throws Exception {
    return Arrays.asList(s.split(" "));
  }
});

// Convert words to Pairs, remember the TextPair class in Hadoop world
JavaPairRDD<String, Integer> wordPairs = words.mapToPair(new PairFunction<String, String, Integer>() {
  public Tuple2<String, Integer> call(String s) {
    return new Tuple2<String, Integer>(s, 1);
  }
});

JavaPairRDD<String, Integer> wordCount = wordPairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
  @Override
  public Integer call(Integer integer, Integer integer2) throws Exception {
    return integer + integer2;
  }
});

// Just for debugging, NOT FOR PRODUCTION
wordCount.foreach(new VoidFunction<Tuple2<String, Integer>>() {
  @Override
  public void call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
    System.out.println(String.format("%s - %d", stringIntegerTuple2._1(), stringIntegerTuple2._2()));
  }
});
//现在我们有了非空行,让我们将它们拆分为单词
JavaRDD words=nonEmptyLines.flatMap(新的flatMap函数(){
@凌驾
公共Iterable调用(字符串s)引发异常{
返回数组.asList(s.split(“”);
}
});
//将单词转换成成对,还记得Hadoop世界中的TextPair类吗
JavaPairRDD wordPairs=words.mapToPair(新的PairFunction(){
公共元组2调用(字符串s){
返回新的Tuple2(s,1);
}
});
javapairdd wordCount=wordPairs.reduceByKey(新函数2(){
@凌驾
公共整数调用(整数、整数2)引发异常{
返回整数+整数2;
}
});
//只是为了调试,不是为了生产
foreach(新的VoidFunction(){
@凌驾
公共void调用(Tuple2 stringIntegerTuple2)引发异常{
System.out.println(String.format(“%s-%d”、stringIntegerTuple2.\u 1()、stringIntegerTuple2.\u 2());
}
});

spark中的
map
reduce
功能与Hadoop的
Mapper
Reducer
功能并不完全相同。感谢Philantrover。但是,如果我在Spark的java wordcount程序中使用整数和字符串类,它将占用更多的字节。我说得对吗?当我需要在映射器阶段用每个字只打印1时,为什么要使用整数?整数占用4个字节。这是浪费记忆,对吗?同样,当我可以将下面的字符串“ATCG”与文本一起存储在4个字节中时,如果我使用Java字符串,则需要8个字节。这里也浪费我的记忆吗?