从文本文件创建一对RDD并应用reduceByKey时出现问题

时间:2015-09-02 05:50:39

标签: scala hadoop apache-spark

要在学习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中有更简单的方法吗?

4 个答案:

答案 0 :(得分:1)

根据键和值的索引拆分文本文件内容,以生成一对RDD。

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

答案 1 :(得分:1)

试试这个:

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等)。

答案 2 :(得分:0)

感谢大家的回复,以下是适合我的解决方案

val lines = sc.textFile(&#34;文件路径&#34;)

val pairs = lines.keyBy(line =&gt;(line.split(&#34;&#34;)(0)))。mapValues(line =&gt; line.split(&#34;&# 34;)(1).trim.toInt)

pairs.reduceByKey((x,y)=&gt; x + y)。foreach(println)

阶&GT; pairs.reduceByKey((x,y)=&gt; x + y)。foreach(println)

(3,10)

(1,2)

答案 3 :(得分:-1)

您可以使用以下

val pairs = lines.flatMap(x =&gt; x.split(&#34; \ n&#34;))

祝你好运!