Hadoop生态圈之Spark

入门使用

1、spark-shell 进入spark模式,scala
2、简单示例

//载入本地txt文件
var xmfile = sc.textFile("file://Users/liuxunming/Desktop/TODO.txt")
//计算总行数,res3: Long = 511
xmfile.count()
//取第一行,res4: String = 做了什么
xmfile.first()
//取包含一的总行数,res6: Long = 121
xmfile.filter(line =>line.contains("一")).count()

验证方法

cat Desktop/TODO.txt | grep "一" -c //同样输出121

3、取数据集中包含单词最多的一行并计算这一行有多少个单词

import java.lang.Math
xmfile.map(line => line.split(" ").size).reduce((a,b) => Math.max(a,b))

这里如果不用Math.max(a,b),即不导入Math库的话,就用if else

if(a>b) a else b

4、单词统计

val wordcounts = xmfile.flatMap(line => line.split("\\|")).map(word => (word,1)).reduceByKey((a,b) => a+b)
wordcounts.collect()

结果如下:

res6: Array[(String, Int)] = Array( (镇江,1), (徐州,4), (扬州,5), (泰州,1), (连云港,4))... 

5、Intelj Idea开发工具开发
新建一个类型为Scala的Project,配置好scala-sdk和spark即可进行正常开发,其中遇到一个问题

java.lang.NoSuchMethodError: scala.Predef$.refArrayOps

上面这个错误的原因就是spark和scala版本不兼容,我的解决方法是降低scala-sdk版本为2.10.6,匹配spark的1.6版本,然后就能正常运行了

6、简单示例

    def main(args: Array[String]): Unit = {
    println("hello scala")

    val inputPath = args(0)
    val outputPath = args(1)

    val conf = new SparkConf()
    conf.setMaster("local[2]").setAppName("HelloWorld")
    val sc = new SparkContext(conf)
    val rdd = sc.textFile(inputPath) //可加可不加 file:///"/Users/liuxunming/Desktop/teacher.txt"
    rdd.cache()
    val wcData = rdd.flatMap(l => l.split("\\|")).
      map(word => (word, 1)).
      reduceByKey(_ + _)
//    wcData.collect().foreach(println)
    wcData.saveAsTextFile(outputPath) // 在项目根目录下生成一个result文件夹存放结果,其实这就相当于是mapreduce里面的输出路径,每次都不能相同。 每次都不能相同,不然报错FileAlreadyExistsException
    sc.stop()
  }

可以传入输入路径和输出路径,放到hdfs环境中去跑,输出结果
在saveAsTextFile前加上.coalesce(1,true) 或者 repartition(1).可以让结果变成只输出一个文件。

你可能感兴趣的:(Big,Data,Hadoop学习笔记)