Transformation操作

object Transformation {
def main(args: Array[String]): Unit = {
//权限被拒绝加下面代码

System.setProperty("HADOOP_USER_NAME", "root")
val conf = new SparkConf()
  .setAppName("WordCount2000")
  .setMaster("local")

val sc = new SparkContext(conf)

//textFile一个 block 对应一个Spark 的一个分区,一个分区对应一个 task

//    val lines = sc.textFile("hdfs://192.168.0.101:8020/number1.txt")
//    val lines1 = sc.textFile("hdfs://192.168.0.101:8020/number2.txt")

//map

//输出多条数据,输出多条数据
//一条记录调用一次,参数函数的处理逻辑
//将原来RDD中的每个元素通过map算子中的用户自定义函数 f 映射,
//转变为一个新的元素,然后返回一个新的RDD
//这个返回的数据集依旧是一个分布式的RDD数据集
//def map[U: classTag](f: T => TraversableOnce[U]): RDD[U] = withScop {}
//_.split("\t")(0) <=> 用户自定义函数f

// val words = lines.map(_.split("\t")(0))

//flatMap(f: T=>U)
//输入一条数据,数据多少条数据
// def flatmap[U: classTag](f: T => TraversableOnce[U]): RDD[U] = withScop {}
//flat 把一行多列的数据压扁成多行单列 ==> 列转行
//spark spark hadoop
//spart
//spark
//hadoop
//.split("\t")(0)
//spark 字符串是字符数组
//s 字符
//p 字符
//a 字符
//r 字符
//k 字符
//map(
.substring(1,2)) 截取单词的个个数1是从1开始到2停下 也就是2 1不会输出

//    val worlds = lines.map(_.split("\t"))
//    val a = worlds.flatMap(x =>x).map(_.substring(1,2))foreach(println(_))

//filter(f :T=>Bool)

//def filter(f: T => Boolean): RDD[T] = withScone{}
//输出的数据集合一定是输入数据集合的 子集(也就是相同的)
//一条记录调用一次 参数函数的处理逻辑
//过滤数据一定是一条记录去过滤的

//    val filterData = lines.filter(_.contains("hadoop")).foreach(println(_))

//reduceByKey

//函数的重载 //reduceByKey 一定是作用于 key-value 格式的数据集上

//def reduceByKey(func: (V, V) =>V): RDD[(k,v)] = self.withScope {}
//def reduceByKey(func: (V, V) =>V, numPartitions: Int): RDD[(k,v)] = self.withScope {}

//    val tuple = lines.map((_,1))
//    val d = tuple.reduceByKey(_ + _) 下面一行代码也行
//    val cnt = tuple.reduceByKey((x,y) =>x+y)
//    cnt.foreach(println(_))
//    cnt.foreach(x =>println(x._1 +"拼接"+x._2)) 遍历到控制台
//    val s = cnt.map(x =>x._1 +"拼接"+x._2)  输出到集群

//sortByKey

//一定是作用于key-value 格式的数据集上的

//    val tuple = lines.map(_.split("\t")(0)).map(_.toInt).map((_,1))
//    val sortData = tuple.reduceByKey(_ + _)
//      .map(x => (x._2,x._1)).sortByKey(true ).map(x => (x._2 +"\t"+ x._1))
//      .foreach(println(_))

//sortBy

//    val sortData = lines.map(_.split("\t")(0)).map(_.toInt).sortBy(x =>x,true)
//    .foreach(println(_))

//untin 将两个文件传进来 同时进行操作,并不进行去重操作,保存所有元素。如果想去重,可以使用distinct()。

//      val tuple =lines.union(lines1).foreach(println(_)) //第一种
//      val tuple = (lines++lines1).foreach(println(_))  //第二种操作符 ++

//distinct去重

//    val tuple = lines.distinct()
//    tuple.saveAsTextFile("hdfs://192.168.0.101:8020/opt1/out/wce")

//groupBy

//(4,CompactBuffer(4, 4, 4, 4))
//(8,CompactBuffer(8))
//(7,CompactBuffer(7, 7))
//(5,CompactBuffer(5, 5))
//(6,CompactBuffer(6))
//(2,CompactBuffer(2, 2, 2, 2, 2))
//(9,CompactBuffer(9, 9))
//(3,CompactBuffer(3, 3, 3, 3, 3))
//(1,CompactBuffer(1, 1, 1))

//  val gp = lines.groupBy(x =>x)

//4 4
//8 1
//7 2
//5 2
//6 1
//2 5
//9 2
//3 5
//1 3

//    val resStr = gp.map(x =>{
//      var strs = ""//定义一个变量
//      val sum = x._2.toList.length
//      for (s <- x._2){
//        strs = x._1 +""+x._2
//      }
//      strs = x._1 +"\t"+ sum
//      strs
//    })

//groupByKey

//(4,CompactBuffer(1, 1, 1, 1))
//(8,CompactBuffer(1))
//(7,CompactBuffer(1, 1))
//(5,CompactBuffer(1, 1))
//(6,CompactBuffer(1))
//(2,CompactBuffer(1, 1, 1, 1, 1))
//(9,CompactBuffer(1, 1))
//(3,CompactBuffer(1, 1, 1, 1, 1))
//(1,CompactBuffer(1, 1, 1))

//    val gpkeys = lines.map((_,1)).groupByKey()
//        val resStr = gp.map(x =>{
//          var strs = ""//定义一个变量
//          val sum = x._2.toList.length
//          for (s <- x._2){
//            strs = x._1 +""+x._2
//          }
//          strs = x._1 +"\t"+ sum
//          strs
//        })

//join 算子作用于在Key-Value

//    val par = lines.map(_.split("\t")).map(x =>((x(0),x(1))))
//    val par1 = lines1.map(_.split("\t")).map(x =>((x(0),x(1))))
//    val JoinData = par.join(par1)  //join 合并
//    val leftData =par.leftOuterJoin(par1) //左连接
//    val rightData = par.rightOuterJoin(par1)  //右连接
//    val fullData = par.fullOuterJoin(par1)  //全连接
//    JoinData.saveAsTextFile("hdfs://192.168.0.101:8020/opt1/out/wce")
//    JoinData.saveAsTextFile("hdfs://192.168.0.101:8020/opt1/out/wce1")
//    JoinData.saveAsTextFile("hdfs://192.168.0.101:8020/opt1/out/wce2")

//cartesian(otherDataset):笛卡尔积, 就是m*n

//    val lines = sc.textFile("hdfs://192.168.0.101:8020/number1.txt")
//    val lines1 = sc.textFile("hdfs://192.168.0.101:8020/number2.txt")
//    val cartData = lines.cartesian(lines1)
//    cartData.saveAsTextFile("hdfs://192.168.0.101:8020/opt1/out/wce")

//foreachPartition

//    val lines = sc.textFile("hdfs://192.168.0.101:8020/number1.txt")
//    //优化问题
//    // RDD 有多少个分区就创建几个 mysql 连接
//    lines.foreachPartition(x =>{
//      //如果没学过jdbc的话看
//      //疯狂讲义
//      //java章节
//      //mysql 连接
//      x.foreach(y =>{
//        y
//      })
//    })

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值