要在学习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中有更简单的方法吗?
答案 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;))
祝你好运!