需求:最近需要统计hbase中某个表行健的长度,最终按照行健长度排序,提取出数据样式如下,rowkey和长度按照“,”分割:
rowkey | 长度 |
---|---|
http:http://www.ccps.gov.cn/ | 28 |
http:http://www.ccps.gov.cn/ | 28 |
1.23.168.192:http/ | 18 |
1.23.168.192:http/ | 18 |
1.23.168.192:http/ | 18 |
1.45.181.61:http:88/ | 20 |
1.45.181.61:http:88/ | 20 |
1.45.181.61:http:88/ | 20 |
… | … |
数据存储在了hdfs中的temp/temp.txt
其代码如下所示:
def main(args:Array[String]):Unit = {
val conf = new SparkConf().setAppName("goafaStatistics")
val sc = new SparkContext(conf)
val lines = sc.textFile("hdfs://hadoop01:9000/temp/temp.txt")
val result = lines.distinct().map(line=>line.split(',')).map(line=>if(line.length>1) (line(1).toInt,line(0)) else (0,"null"))
val result1 = result.sortByKey(false)
result1.saveAsTextFile("hdfs://hadoop01:9000/temp/output")
}
但是当执行完后我们发现由于spark会分布式处理将数据分到不同的partition中,所以在output文件中生成多个文件,如下图所示:
而我们想要生成的是一个文件,所以需要在sortByKey之前重新制定以下分区,将sortByKey前代码改为如下:
val result1 = result.repartition(1).sortByKey(false)
最终代码改为如下:
def main(args:Array[String]):Unit = {
val conf = new SparkConf().setAppName("goafaStatistics")
val sc = new SparkContext(conf)
val lines = sc.textFile("hdfs://hadoop01:9000/temp/temp.txt")
val result = lines.distinct().map(line=>line.split(',')).map(line=>if(line.length>1) (line(1).toInt,line(0)) else (0,"null"))
val result1 = result.repartition(1).sortByKey(false)
result1.saveAsTextFile("hdfs://hadoop01:9000/temp/output")
}
效果如下: