分享

新手求助该如何实现这个简单的逻辑?

dsy198816 发表于 2017-2-5 14:45:55 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 9755
下面是我要处理的日志,每个元素以|分开,最后的元素是域名,我要统计每个域名有多少条日志。
49|17825793|2887524685|0|3030586780|177045333|0|80|43331|0|1|1999|0|0|0|0|0|1481108400|1481108400|0|0|0|0|0|mayybstat.3g.qq.com

然后逻辑我就不知道在怎么实现了。。代码只会写下面几行
object WordCount {
   def main(args: Array[String]) {

     val conf = new SparkConf()
     val sc = new SparkContext(conf)
     val line = sc.textFile("mylog")

     sc.stop()
   }
}

我想的逻辑是这样的,
1.先把文件读入一个rdd,这样这个rdd里每个元素就是一行日志了。
2.这个日志每个元素以| 分开,如何删除这个rdd里除最后一个元素之外的所有元素?(不知道咋实现。。。)
3.调用mapvalues(x => (x,1)),变成pair rdd ,再到用reduceByKey聚合累加。(不太清楚。。没实现过)



求大神随便写几句代码,提示下,或者告诉我用哪个函数,要是有能直接跑的代码就更好啦,拜托拉。。。

已有(4)人评论

跳转到指定楼层
xuanxufeng 发表于 2017-2-6 10:20:00
本帖最后由 xuanxufeng 于 2017-2-6 10:21 编辑

object WordCount {
   def main(args: Array[String]) {

     val conf = new SparkConf()
     val sc = new SparkContext(conf)
     val inFile = sc.textFile("mylog")
     val pairs=inFile.map(_.split("|").take(22).map(x=>(x,1)))
     val wordCounts = pairs.reduceByKey(_ + _)
     sc.stop()
   }
}

上面的思路是先分割,然后根据分组获取第22个元素,也就是mayybstat.3g.qq.com,然后形成新的rdd,这个里面只有域名,然后通过map,形成key,value。也就是
mayybstat.3g.qq.com 1
www.aboutyun.com 1
然后通过reduceByKey统计个数
楼主可以调试下

回复

使用道具 举报

rsgg03 发表于 2017-2-5 21:24:57
还不太熟悉,相互进步吧。下面只是过滤,分组后面在想想
# 创建textFileRDD
val textFile = sc.textFile("file path")

# 筛选出包括Spark关键字的RDD然后进行行计数
val  linesWithSpark = textFile.filter(line => line.contains("mayybstat.3g.qq.com"))
linesWithSpark.count()

楼主转换pair rdd是为了分组吧。


回复

使用道具 举报

easthome001 发表于 2017-2-5 20:59:23
没有环境,楼主只能自己调试下了。思路都是对的
2.这个日志每个元素以| 分开,如何删除这个rdd里除最后一个元素之外的所有元素?
对于第二个问题,每太弄明白。是只想读取最后一个元素吗?


回复

使用道具 举报

w517424787 发表于 2017-2-6 11:45:54
val pairs=inFile.map(_.split("|").take(22).map(x=>(x,1))) ---这句应该是 val pairs=inFile.map(_.split("|").take(22)).map(x=>(x,1))
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条