从文本文件在spark中创建一对rdd并应用reducebykey时出现的问题

yyhrrdl8  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(309)

要运行学习spark中给出的一些简单的spark转换,我需要创建一对rdd
(例如:{(1,2),(3,4),(3,6)})
创建这个的最佳方法是什么,这样我就可以在上面使用groupbykey()等。我试着把它放在一个文件中,并阅读下面的代码,但有些人认为这是行不通的
文本文件内容

  1. 1 2
  2. 3 4
  3. 3 6

代码

  1. val lines = sc.textFile("path_to_file")
  2. val pairs = lines.map(x => (x.split(" ")(0), x))
  3. pairs.foreach(println)

打印如下

  1. scala> pairs.foreach(println)
  2. (1,1 2)
  3. (3,3 4)
  4. (3,3 6)

当我想要它的时候

  1. 1 2
  2. 3 4
  3. 3 6

在scala有没有更简单的方法?

gopyfrb3

gopyfrb31#

基于关键字和值的索引拆分文本文件内容,以生成一对rdd。

  1. val pairs = lines.map(x => (x.split(" ")(0), (x.split(" ")(1)))
a9wyjsp7

a9wyjsp72#

谢谢大家的回复,这是对我有效的解决方案
val lines=sc.textfile(“文件路径”)
val pairs=lines.keyby(line=>(line.split(“”(0))).mapvalues(line=>line.split(“”(1).trim.toint)
pairs.reducebykey((x,y)=>x+y).foreach(println)
scala>pairs.reducebykey((x,y)=>x+y).foreach(println)
(3,10)
(1,2)

jslywgbw

jslywgbw3#

试试这个:

  1. scala> val pairsRDD = lines.flatMap { x =>
  2. x.split("""\s+""") match {
  3. case Array(a,b) => Some((a,b))
  4. case _ => None
  5. }
  6. }
  7. pairsRDD: org.apache.spark.rdd.RDD[(String, String)] = MapPartitionsRDD[21] at flatMap at <console>:23
  8. scala> val pairs = pairsRDD.collect
  9. pairs: Array[(String, String)] = Array((1,2), (3,4), (3,6))
  10. scala> pairs foreach println
  11. (1,2)
  12. (3,4)
  13. (3,6)

注意:如果希望值是数字而不是 String ,只需添加类型转换( .toInt , .toDouble 等等)。

展开查看全部
3wabscal

3wabscal4#

您可以使用以下方法
val pairs=lines.flatmap(x=>x.split(“\n”))
祝你好运!

相关问题