我有一个以下形式的输入文件:
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
答案 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))