我有以下形式的输入文件:
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最大和最小"tc“分别为45和24。我有以下代码:
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
发布于 2016-10-12 01:38:03
您使用的是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显然并不重要,可以保留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))
https://stackoverflow.com/questions/39995158
复制相似问题