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

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

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

1 2

3 4

3 6

代码

val lines = sc.textFile("path_to_file")

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

pairs.foreach(println)

打印如下

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

当我想要它的时候

1 2

3 4

3 6

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

gopyfrb3

gopyfrb31#

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

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#

试试这个:

scala> val pairsRDD = lines.flatMap { x => 
           x.split("""\s+""") match {
                case Array(a,b) => Some((a,b))
                case _ => None
           }
       }
pairsRDD: org.apache.spark.rdd.RDD[(String, String)] = MapPartitionsRDD[21] at flatMap at <console>:23

scala> val pairs = pairsRDD.collect
pairs: Array[(String, String)] = Array((1,2), (3,4), (3,6))

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

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

3wabscal

3wabscal4#

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

相关问题