Spark案例实战之二
0.如果打开的是本地文件,则是三个’/’,如file:///usr/local/spark/mycode/wordcount/word.txt
01.reduceByKey((a,b)=> a+b) 把具有相同键的map的value加起来
02,如果是集群环境下,想在driver节点上打印所有结果,就需要使用collect方法,
1.pair RDD的创建方式
01,读取文件
02,通过并行集合(数组)创建RDD
val lines = sc.textFile(“file:///usr/local/spark/mycode/wordcount/word.txt”)
map(word=>(word,1))使用map进行函数操作。形成键值对
val pariRDD = lines.flatMap(line => line.split(” “)).map(word=>(word,1))
pairRDD.foreach(println) 竟然可以将println作为参数
2.pairRDD的通用操作
01,reduceByKey(func)的功能:使用func函数合并具有相同键的值。默认是从左到右,依次累加。【一定要注意:是合并具有相同键的值】
(hadoop,1)
(spark,1)
(hive,1)
(spark,1)
上面具有相同键的值就是spark,spark.
02,系统可以自动推断出来是参数的类型,所有我们在传入参数的时候,就不用写参数的类型了。
reduceByKey((a,b0=>a+b).foreach(println)
03.reduceByKey会进行一个Merge操作
groupBykey 本身不能自定义函数,需要先使用groupBykey之后,再使用map()操作
【上述的代码必须在Spark中使用,而不能尽在scala的环境中使用】
val words = Array(“spark”,”hadoop”,”scala”,”Java”,”spark”)
val result1 = sc.parallelize(words).map(word=>(word,1))
val result2 = result1.reduceByKey(+)
val result3 = result2.groupByKey().map(t=>(t._1,t._2.sum)) 列表是一个Iterator类型,所以可以使用sum进行求和
keys,values,soryByKey
调用sortByKey的前提是:这个东西必须是键值对
val d1 = sc.parallelize(Array((“c”,8),(“e”,8),(“d”,3),(“a”,6),(“c”,2))
d1.reduceByKey(+).sortByKey(flase).collect//必须通过collect操作,才能将所有结果收集到Driver所在的节点上
d1.reduceByKey(+).sortBy(_._2,false).collect
sc.parallelize是什么意思?
val result1 = rdd.groupByKey()
//CompactBuffer是什么?
1.hdfs 上传文件的时候,如果里面有多个文件,则需要使用-p参数,否则不能将文件夹中的文件全部上传到其中。
2.hdfs dfs -put /root/donation/block_*/block* /linkage
这里的block_*/block_* 采用了两次的*通配符,简直是太厉害!
3.从hdfs上读入文件:
scala> val rawblocks = sc.textFile(“hdfs://localhost:9000/linkage/block_1.csv”)
rawblocks: org.apache.spark.rdd.RDD[String] = hdfs://localhost:9000/linkage/block_1.csv MapPartitionsRDD[7] at textFile at :24
4.取rdd的第一行
scala> rawblocks.first
res3: String = “id_1”,”id_2”,”cmp_fname_c1”,”cmp_fname_c2”,”cmp_lname_c1”,”cmp_lname_c2”,”cmp_sex”,”cmp_bd”,”cmp_bm”,”cmp_by”,”cmp_plz”,”is_match”
2,groupByKey()
对具有相同key的value进行分组,生成的是列表,但不会将相同key的value累加
(hadoop,1)
(spark,1)
(hive,1)
(spark,1)
得到的结果就是:(spark,(1,2)) (hadoop,1),(hive,1)
[(String,Iterable[Int])] Iterable是一个列表
每次观察返回的RDD是什么类型
可以使用Iterator将列表中的值取出来。