zoukankan      html  css  js  c++  java
  • Spark算子:RDD基本转换操作(1)–map、flatMap、distinct

    Spark算子:RDD基本转换操作(1)–map、flatMap、distinct

    关键字:Spark算子、Spark RDD基本转换、map、flatMap、distinct

    • map

    将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。

    输入分区与输出分区一对一,即:有多少个输入分区,就有多少个输出分区。

    1. hadoop fs -cat /tmp/lxw1234/1.txt
    2. hello world
    3. hello spark
    4. hello hive
    5.  
    6.  
    7. //读取HDFS文件到RDD
    8. scala> var data = sc.textFile("/tmp/lxw1234/1.txt")
    9. data: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at :21
    10.  
    11. //使用map算子
    12. scala> var mapresult = data.map(line => line.split("\s+"))
    13. mapresult: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[2] at map at :23
    14.  
    15. //运算map算子结果
    16. scala> mapresult.collect
    17. res0: Array[Array[String]] = Array(Array(hello, world), Array(hello, spark), Array(hello, hive))
    18.  
    19.  
    • flatMap

    属于Transformation算子,第一步和map一样,最后将所有的输出分区合并成一个。

    1. /使用flatMap算子
    2. scala> var flatmapresult = data.flatMap(line => line.split("\s+"))
    3. flatmapresult: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at flatMap at :23
    4.  
    5. //运算flagMap算子结果
    6. scala> flatmapresult.collect
    7. res1: Array[String] = Array(hello, world, hello, spark, hello, hive)
    8.  

    使用flatMap时候需要注意:
    flatMap会将字符串看成是一个字符数组。
    看下面的例子:

    1. scala> data.map(_.toUpperCase).collect
    2. res32: Array[String] = Array(HELLO WORLD, HELLO SPARK, HELLO HIVE, HI SPARK)
    3. scala> data.flatMap(_.toUpperCase).collect
    4. res33: Array[Char] = Array(H, E, L, L, O, , W, O, R, L, D, H, E, L, L, O, , S, P, A, R, K, H, E, L, L, O, , H, I, V, E, H, I, , S, P, A, R, K)
    5.  

    再看:

    1. scala> data.map(x => x.split("\s+")).collect
    2. res34: Array[Array[String]] = Array(Array(hello, world), Array(hello, spark), Array(hello, hive), Array(hi, spark))
    3.  
    4. scala> data.flatMap(x => x.split("\s+")).collect
    5. res35: Array[String] = Array(hello, world, hello, spark, hello, hive, hi, spark)
    6.  

    这次的结果好像是预期的,最终结果里面并没有把字符串当成字符数组。
    这是因为这次map函数中返回的类型为Array[String],并不是String。
    flatMap只会将String扁平化成字符数组,并不会把Array[String]也扁平化成字符数组。

    参考:
    http://alvinalexander.com/scala/collection-scala-flatmap-examples-map-flatten

    • distinct

    对RDD中的元素进行去重操作。

      1. scala> data.flatMap(line => line.split("\s+")).collect
      2. res61: Array[String] = Array(hello, world, hello, spark, hello, hive, hi, spark)
      3.  
      4. scala> data.flatMap(line => line.split("\s+")).distinct.collect
      5. res62: Array[String] = Array(hive, hello, world, spark, hi)
  • 相关阅读:
    真-关闭win10安全中心(windows defender)
    HOOK IDT频繁蓝屏(Window 正确 HOOK IDT)
    windows 驱动开发 MDL 内核层 用户层共享内存
    C++将时间格式转换成秒数
    关于HOOK KiPageFault需要用到自旋锁研究
    提高VS2010/VS2012编译速度
    apache2.2服务无法启动 发生服务特定错误:1 的解决办法 (windows服务错误 日志查看方法)
    内核同步对象
    C++/MFC-线程优先级
    python xml转excel
  • 原文地址:https://www.cnblogs.com/devin-ou/p/8028305.html
Copyright © 2011-2022 走看看