map、flatMap(流的扁平化)、split 的区别

map、flatMap(流的扁平化)、split 的区别Impala 操作 读写 Kudu 使用 druid 连接池 Kudu 原理 API 使用 代码 KuduJavaAPI 条件查询 spark 读取 kudu 表导出数据为 parquet 文件 sparkkudupa

大家好,欢迎来到IT知识分享网。

map、flatMap(流的扁平化)、split 的区别日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


  • Impala 操作/读写 Kudu,使用druid连接池
  • Kudu 原理、API使用、代码
  • Kudu Java API 条件查询
  • spark读取kudu表导出数据为parquet文件(spark kudu parquet)
  • kudu 导入/导出 数据
  • Kudu 分页查询的两种方式
  • map、flatMap(流的扁平化)、split 的区别
  • Spark(SparkSql) 写数据到 MySQL中(Spark读取TCP socket/文件)
  • Spark Streaming 整合 Kafka(Spark读取Kafka)
  • Spark Streaming 开窗函数 reduceByKeyAndWindow
  • Spark Streaming 整合 Flume(Spark读取Flume)
  • Spark 实时处理 总文章
  • spark程序打包为jar包,并且导出所有第三方依赖的jar包
  • spark提交命令 spark-submit 的参数 executor-memory、executor-cores、num-executors、spark.default.parallelism分析

 


1.flatMap:     流的扁平化,最终输出的数据类型为一维数组Array[String]。     被分割出来的每个数据都作为同一个数组中的相同类型的元素,最终全部被分割出来的数据都存储于同一个一维数组中。     结论:多行数据被分割后都存储到同一个一维数组Array[String]中。 2.map:     最终输出的数据类型为二维数组Array[Array[String]]。     以相同分隔符分割出来的数据存储到同一个一维数组Array[String]中,一旦遇到分隔符所无法分割的位置(如遇到回车换行符时)时,     便创建出一个新的一维数组Array[String],后面所分割的数据则都存储到新的一维数组Array[String]中,     即分隔符所无法分割的位置作为新建一维数组Array[String]的标志。     结论:一行数据就为一个一维数组Array[String],多行数据就有多个一维数组,最终多个一维数组一起被封装到同一个一维数组中。
        读取本地文件,实现文件内的单词计数。         本地文件 /root/scala/words.txt 内容如下:             hello me             hello you             hello her         sc.textFile("file:///root///scala///words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect         输出 res0: Array[(String, Int)] = Array((hello,3), (me,1), (you,1), (her,1))       解析:         1.flatMap(_.split(" ")):输出数据 Array[String] = Array(hello,me,hello,you,hello,her)             使用空格作为换行分隔符,被分割出来的每个数据都作为同一个数组中的相同类型的元素,最终全部被分割出来的数据都存储于同一个一维数组中。             同时还会以回车换行符作为默认的分隔符,即回车换行符前面的数据也会被自动进行分割,而回车换行符后面所分割出来的数据同样存储于同一个一维数组中。         2.map(_.split(" ")):输出数据 Array[Array[String]] = Array(Array(hello,me),(Array(hello,you),(Array(hello,her))             使用空格作为换行分隔符,以相同分隔符分割出来的数据存储到同一个一维数组Array[String]中,最终输出的数据类型为二维数组Array[Array[String]]。             同时还会以回车换行符作为新建一维数组Array[String]的标志,而回车换行符后面所分割的数据则都存储到新的一维数组Array[String]中。         3.map((_,1)):             map()首先表示遍历出数组中的每个元素。             flatMap(_.split(" ")).map((_,1)):遍历出的是每个字符串 hello,me,hello,you,hello,her             map(_.split(" ")).map((_,1)):遍历出出的是每个Array数组 Array(hello,me),Array(hello,you),Array(hello,her)     

=====================================================

val rdd1 = sc.parallelize(Seq(("one two three four five six seven"), ("one two three four five six seven"), ("one two three four five six seven")))    rdd1.map(_.split(" ")).collect /* res6: Array[Array[String]] = Array(Array(one, two, three, four, five, six, seven),                                   Array(one, two, three, four, five, six, seven),                                   Array(one, two, three, four, five, six, seven)) */   rdd1.flatMap(_.split(" ")).collect /* res7: Array[String] = Array(one, two, three, four, five, six, seven,                             one, two, three, four, five, six, seven,                             one, two, three, four, five, six, seven) */     val rdd2 = sc.parallelize(Seq((1, "one two three four five six seven"), (2, "one two three four five six seven"), (3, "one two three four five six seven")))   rdd2.map(x => (x._1, x._2.split(" "))).collect /* res14: Array[(Int, Array[String])] = Array((1,Array(one, two, three, four, five, six, seven)),                                            (2,Array(one, two, three, four, five, six, seven)),                                            (3,Array(one, two, three, four, five, six, seven))) */     rdd2.map(x =>  {     val x2 = x._2.split(" ")     (x._1, x2.toIterable) }).collect /* res4: Array[(Int, Iterable[String])] = Array((1,WrappedArray(one, two, three, four, five, six, seven)),                                              (2,WrappedArray(one, two, three, four, five, six, seven)),                                              (3,WrappedArray(one, two, three, four, five, six, seven))) */   rdd2.map(x =>          {         val x2 = x._2.split(" ")         (x._1, x2.toIterable)         }).flatMap        { x =>             val y = x._2         for (w <- y) yield (x._1, w)       }.collect   /* res7: Array[(Int, String)] = Array((1,one), (1,two), (1,three), (1,four), (1,five), (1,six), (1,seven),                                    (2,one), (2,two), (2,three), (2,four), (2,five), (2,six), (2,seven),                                    (3,one), (3,two), (3,three), (3,four), (3,five), (3,six), (3,seven)) */

===============================================================================================

scala> val s = "eggs, milk, butter, Coco Puffs" //除第一个单词外的每个单词前面都带有空格 s: String = eggs, milk, butter, Coco Puffs scala> s.split(",") res9: Array[String] = Array(eggs, " milk", " butter", " Coco Puffs") //除第一个单词外的每个单词前面都带有空格 scala> val s1 = "eggs,milk,butter, Coco Puffs" //只有最后一个单词的前面带有空格 s1: String = eggs,milk,butter, Coco Puffs scala> s1.split(",") res10: Array[String] = Array(eggs, milk, butter, " Coco Puffs")//只有最后一个单词的前面带有空格 scala> val s = "eggs, milk, butter, Coco Puffs" s: String = eggs, milk, butter, Coco Puffs scala> s.split(",").map(_.trim)  //trim 去掉“被分割出来的每个字符串前后面的”空格字符 res11: Array[String] = Array(eggs, milk, butter, Coco Puffs)  
//要处理的字符串数据为:"中国|美国|英国"。目的是希望切开得到每个国家("中国","美国","英国"),然而结果却是("中","国","美","国","英","国") import org.apache.spark.sql.functions._ split(data(field), "|"))  //data是一个Spark DataFrame,其中的field字段是由竖杠|隔开的字符串(如:"中国|美国|英国") //要处理的字符串数据为:"中国|美国|英国"。而结果正是切开得到每个国家("中国","美国","英国") import org.apache.spark.sql.functions._ split(data(field), "\\|"))

===============================================================================================

String中的 split(",") 和 split(",",-1) 的区别 1、当准备要被切割处理的字符串的最后一位有值(非分隔符)时,两者没有区别。 2、当准备要被切割处理的字符串的最后一位或者最后N位全部都是分隔符,而并非正常数据时,split(",")不会继续切分,并且不保留为null值,    而split(",",-1)继续进行切分,并且保留出null值作为被切割出来的数据。 package stringsplit; public class stringSplit  {      public static void main(String[] args)       {           String line = "hello,,world,,,";           String res1[] = line.split(",");           String res2[] = line.split(",", -1);           int i=1;           for(String r: res1)               System.out.println(i+++r);           System.out.println("========================");           i=1;           for(String r: res2)               System.out.println(i+++r);      } 输出结果是: 1hello 2 3world ======================== 1hello 2 3world 4      //保留为null值作为被切割出来的数据 5      //保留为null值作为被切割出来的数据 6      //保留为null值作为被切割出来的数据 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/113488.html

(0)
上一篇 2025-12-14 10:00
下一篇 2025-12-14 10:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信