如何比较2列并在Scala中进行串联

时间:2019-06-09 18:16:05

标签: eclipse scala apache-spark

这是我的文本文件,是程序的输入内容

Id       Title Copy
B2002010 gyh   1
D2001001 abc   12
M2003005 zxc   3
D2002003 qwe   13
M2001002 efg   1
D2001004 asd   6
D2003005 zxc   3
M2001006 wer   6
D2001006 wer   6
B2004008 sxc   10
D2002007 sdf   9
D2004008 sxc   10

ID的格式为Xyyyyrrr,其中:

  • XB =>书籍或M =>杂志
  • yyyy是年份
  • rrr是随机数。

我要做的是:获取同一年的书籍或杂志的总份数。另外,对“复制”列进行一次小数据清除,如果我发现数字以外的内容,我将其替换为“ 0”。

我的Spark项目在Eclipse上,并且我正在使用Maven和Scala IDE 我需要使用MapReduce函数。

我已经启动了分割文本文件的Map函数。

这是我开始的代码:

package bd.spark_app

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql._
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.rdd.RDD.rddToOrderedRDDFunctions
import scala.io.Source
import org.apache.spark.sql.functions._
import scala.collection.mutable.WrappedArray
import org.apache.log4j._
import org.apache.spark.sql.types.{StructType, StructField, StringType}
import org.apache.spark.sql.Row
import scala.Array

object alla {
  def main(args:Array[String]) = {
    val conf = new SparkConf().setMaster("local").setAppName("trying")
    val sc = new SparkContext(conf)
    val x = sc.textFile("/home/hadoopusr/sampledata")

    x.map(_.split(" ")).foreach(r => 
      println(r(0).dropRight(3), r(2))
    )

    sc.stop()
  }
} 

这是我上面显示的Map函数的结果

(B2002,1)
(D2001,12)
(M2003,3)
(D2002,13)
(M2001,1)
(D2001,6)
(D2003,3)
(M2001,6)
(D2001,6)
(B2004,10)
(D2002,9)
(D2004,10)
(M2004,11)
(D2004,11)

我只需要某种归约功能,即可获取同一年的所有书籍和杂志,并将份数加在一起,并检查“份数”列是否为数字

示例:对于记录(B2002,12)(B2002,16),结果应为(B2002,28)

1 个答案:

答案 0 :(得分:2)

可以使用方法“ reduceByKey”:

val converted = x.map(_.split(" ")).map(r => (r(0).dropRight(3), r(2).toInt))
val result = converted.reduceByKey(_ + _)

输出:

(M2001,7)
(D2001,24)
(M2003,3)
(D2003,3)
(D2002,22)
(D2004,10)
(B2002,1)
(B2004,10)

注意:看起来输入文件的格式为“ csv”,最好使用“ spark.read.csv”读取数据,并使用DataFrame代替RDD。