Spark代码找到最大不起作用

时间:2016-10-12 09:29:38

标签: scala apache-spark


我有一个以下形式的输入文件:

twid,usr,tc,txt
1234,abc,24,fgddf
3452,vcf,54,gdgddh
7684,fdsa,32,fgdhs
1234,abc,45,fgddf
3452,vcf,25,gdgddh

我的目的是为“twid”列中的每个值获取“tc”列中的最大值和最小值。例如,1234的twid分别具有45和24的最大和最小“tc”。我有以下代码:

val tweet = sc.textFile(inputFile)
val MaxTweetId = tweet.map(x => (x,x.split(",")(2).toInt)).reduceByKey((x,y) => if(x>y) x else y)       
val MinTweetId = tweet.map(x => (x,x.split(",")(2).toInt)).reduceByKey((x,y) => if(x>y) y else x)       

但我没有得到最大值和最小值的正确值。我究竟做错了什么?我希望格式为MaxTweetId.collect的输出:

1234,abc,45,fgddf
3452,vcf,54,gdgddh
7684,fdsa,32,fgdhs

1 个答案:

答案 0 :(得分:2)

您使用x(整行)作为键,而不只使用第一个"列"。您可以先将RDD转换为正确的RDD[(Int, Int)]结构,然后找到Max和Min:

val keyValuePairs = tweet
  .map(_.split(","))
  .map { case Array(twid, _, tc, _) => (twid.toInt, tc.toInt) }

val MaxTweetId = keyValuePairs.reduceByKey(Math.max)
val MinTweetId = keyValuePairs.reduceByKey(Math.min)

编辑:转换" twid"字段变成String显然不那么重要,可以保留字符串:

val keyValuePairs = tweet
  .map(_.split(","))
  .map { case Array(twid, _, tc, _) => (twid, tc.toInt) }

如果这种语法令人困惑 - 这会产生相同的结果(至少对于有效记录):

val keyValuePairs = tweet
  .map(_.split(","))
  .map(x => (x(0), x(2).toInt))