加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 并行处理列的Spark

发布时间:2020-12-16 18:36:00 所属栏目:安全 来源:网络整理
导读:我一直在玩Spark,我设法让它来处理我的数据.我的数据由平面分隔的文本文件组成,包含50列和大约2千万行.我有 scala脚本来处理每一列. 在并行处理方面,我知道RDD操作在多个节点上运行.因此,每次处理列时,它们都会并行处理,但列本身会按顺序处理. 一个简单的例
我一直在玩Spark,我设法让它来处理我的数据.我的数据由平面分隔的文本文件组成,包含50列和大约2千万行.我有 scala脚本来处理每一列.

在并行处理方面,我知道RDD操作在多个节点上运行.因此,每次处理列时,它们都会并行处理,但列本身会按顺序处理.

一个简单的例子:如果我的数据是5列文本分隔文件,每列包含文本,我想为每列做单词计数.我会做:

for(i <- 0 until 4){
   data.map(_.split("t",-1)(i)).map((_,1)).reduce(_+_)
}

尽管每列的操作是并行运行的,但列本身是按顺序处理的(我知道的措辞不好.抱歉!).换句话说,在第1列完成后处理第2列.在第1列和第2列完成后处理第3列,依此类推.

我的问题是:无论如何一次处理多个列?如果你知道一种方法,教程,你介意与我分享吗?

谢谢!!

解决方法

假设输入是seq.可以执行以下操作以同时处理列.基本思想是使用序列(列,输入)作为键.

scala> val rdd = sc.parallelize((1 to 4).map(x=>Seq("x_0","x_1","x_2","x_3")))
rdd: org.apache.spark.rdd.RDD[Seq[String]] = ParallelCollectionRDD[26] at parallelize at <console>:12

scala> val rdd1 = rdd.flatMap{x=>{(0 to x.size - 1).map(idx=>(idx,x(idx)))}}
rdd1: org.apache.spark.rdd.RDD[(Int,String)] = FlatMappedRDD[27] at flatMap at <console>:14

scala> val rdd2 = rdd1.map(x=>(x,1))
rdd2: org.apache.spark.rdd.RDD[((Int,String),Int)] = MappedRDD[28] at map at <console>:16

scala> val rdd3 = rdd2.reduceByKey(_+_)
rdd3: org.apache.spark.rdd.RDD[((Int,Int)] = ShuffledRDD[29] at reduceByKey at <console>:18

scala> rdd3.take(4)
res22: Array[((Int,Int)] = Array(((0,x_0),4),((3,x_3),((2,x_2),((1,x_1),4))

示例输出:((0,4)表示第一列,键为x_0,值为4.您可以从此处开始进一步处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读