ApacheSparkBook
                                
                                 ApacheSparkBook copied to clipboard
                                
                                    ApacheSparkBook copied to clipboard
                            
                            
                            
                        第三章《Spark 逻辑处理流程》勘误与修改建议
Page 65, 图 3.13 的 2,k, 3,e 为啥不是2,k1, 3,e1
@isplendid 因为combineByKey中的createCombiner()只会作用于相同key的第一个record。在本例中,处理<2, b>时发现key=2没有被处理过,所以使用createCombiner()将b转换为b1,得到<2, b1>,保存在内存中。接下来处理<2, k>,由于key=2已经被处理过(在内存中),所以使用mergeValue()来处理<2, k>,也就是mergeValue(<2, b1>, <2, k>) => <2, b1+k>。
可以使用下面的示例程序来验证:
import org.apache.spark.sql.SparkSession
object CombineByKeyExample {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder
      .appName("combine by key example")
      .master("local[2]")
      .getOrCreate()
    val sc = spark.sparkContext
    val inputRDD = sc.parallelize(Array[(Int, Char)](
      (1, 'a'), (2, 'b'), (2, 'k'), (3, 'c'), (4, 'd'), (3, 'e'),
      (3, 'f'), (2, 'g'), (2, 'h')
    ), 3)
    println("-----------input RDD--------")
    inputRDD.mapPartitionsWithIndex((pid, iter) => {
      iter.map(value => "PID: " + pid + ", value: " + value)
    }).foreach(println)
    val resultRDD = inputRDD.combineByKey((v: Char) => {
      if (v == 'c') {
        v + "0"
      } else {
        v + "1"
      }
    }
      , (c: String, v: Char) => c + "+" + v, (c1: String, c2: String) => c1 + "_" + c2, 2)
    //    val resultRDD = inputRDD.combineByKey((v:Char)=>List(v), (c:List[Char],v:Char)=>v::c,(c1:List[Char],c2:List[Char])=>c1:::c2)
    println(resultRDD.toDebugString)
    println("-----------result RDD--------")
    resultRDD.mapPartitionsWithIndex((pid, iter) => {
      iter.map(value => "PID: " + pid + ", value: " + value)
    }).foreach(println)
  }
}
Page 61, aggregateByKey()操作的标题前的倒数第三行末尾起 在性能上,相比groupBykey()、reduceByKye()可以在Shuffle之前使用func对数据进行聚合,减少了…… 这边的顿号应该改为逗号
第54页的表格内sampleByKey()的例子中的“用法”中应该是rdd2 = rdd1.sampleByKey(true,map)

第56页,list应该为List

@swordspoet 多谢指出,下次印刷时会进行更正。
@zeahoo 多谢指出,下次印刷时会进行更正。
P74:“Key是Int类型,并从[0, numPartitions)中随机生成,……”。其中Key的范围是不是都应该是闭区间,不然就对不上P73图(2)中展示的Key——若不包含2,那么随机生成的整型如何得到2,接下来的record的Key+1又怎么得到3?
P87:图3.31(3)中MapPartitionsRDD有误
@JerryLead 2020 10 月 第二次印刷的版本,里面第86页的内容 缺失,变成了第96页的内容, 96页的也还是96页的内容,能不能拍张86页的照片?
P74:“Key是Int类型,并从[0, numPartitions)中随机生成,……”。其中Key的范围是不是都应该是闭区间,不然就对不上P73图(2)中展示的Key——若不包含2,那么随机生成的整型如何得到2,接下来的record的Key+1又怎么得到3?
感谢指出,目前代码实现是[0, numPartitions),生成的key应该是[0, 2),图中的key应该都减去1。
@wangdxh
我这里只有第一版的,我把85页、86页、87页都拍了照发在这里:
 
 

page 52,图3.5,filter图示中,对于tuple
2,g
结果写成了2_g
page65中的图3.13右侧应该是3,(c0+e, f1) -> 3, c0+e_f1

P61,页面中间那段:在性能上,相比groupByKey()、reduceByKey()可以在Shuffle之前使用func... 、应该改成逗号
P67图3.15中的文字跟其他图片的字体不一样
P73 左下角的图,最后一个分区,应该是 3, (5, e); 4, (2, g) ,而不是 3, (5, e) ; 6, (2, g) 吧?Key不是递增的吗?
P80 图 3.25 中的 rdd3 左边第一个分区,rdd1 中还包含 (1, b) 的吧?