在scala中,官方给出的输出函数是xxx.foreach(println)。这样的输出格式往往不能满足我们的要求。比如,现在有数据[1,2,3,4,5]。如果按照官方给的格式,输出结果为:
如果数据量很大的话,这样的格式太难看了。我们真正想要的输出格式为:
其实scala输出这样的格式还是比较困难的,这语言不能像java等一般语言一样,一个for循环或者一个join就搞定了。实现上述功能的scala代码如下:
val conf = new SparkConf().setAppName("UsridPartitioner").setMaster("local")
val sc = new SparkContext(conf)
val a = Array(1,2,3,4) //数据列表
val rdd = sc.parallelize(a) //转为rdd
println(rdd.map(x => x.toString).reduce((x,y) => x+","+y)) //先转string 再做reduce处理
有时候,对于一个rdd来说,里面会存储多个分区的内容,比如:分区1中存储0,2,3,4,5,6,7,8,9。分区2中存储10,12,13,14,15,16,17,18,19。分区3中存储20,21,22,23,24,25,26,27,28,29。如果采用上述方案进行输出的话,代码为:
val conf = new SparkConf().setAppName("UsridPartitioner").setMaster("local")
val sc = new SparkContext(conf)
val data = sc.parallelize(0 to 29, 3) //构建分区
println(data.map(x => x.toString).reduce((x,y) => x + "," + y))
输出结果为:
这似乎并不是我们要想的输出,我们希望一个分区能占一行,每一行中按照最开始的方案输出,也就是:
其对应的代码为:
val conf = new SparkConf().setAppName("UsridPartitioner").setMaster("local")
val sc = new SparkContext(conf)
val data = sc.parallelize(0 to 29, 3) //构建分区
for(i <- 0 to 2){
//首先,提取对应分区元素集合,然后转为字符串并用reduce方法通过“,”把不同元素连接起来
println(data.filter(x=> TaskContext.get.partitionId == i).map(x=> x.toString).reduce((x,y) => x+","+y))
}
初次学习scala,感觉这语言输出不是很方便,也就自己捣鼓捣鼓,应该会有更好的输出方案。