关键概念
- partitionColumn:分区字段,需要是数值类的(partitionColumn must be a numeric column from the table in question.),经测试,除整型外,float、double、decimal都是可以的
- lowerBound:下界,必须为整数
- upperBound:上界,必须为整数
- numPartitions:最大分区数量,必须为整数,当为0或负整数时,实际的分区数为1;并不一定是最终的分区数量,例如“upperBound - lowerBound< numPartitions”时,实际的分区数量是“upperBound - lowerBound”;
- 在分区结果中,分区是连续的,虽然查看每条记录的分区,不是顺序的,但是将rdd保存为文件后,可以看出是顺序的。
验证
数据准备
在Mysql中创建表partition并插入数据,如下所示(两个字段都为int):
在spark-shell中进行相关概念验证
1. 启动spark-shell
2. 在spark-shell中读取准备的mysql中的数据
scala> val jdbcDF = spark.read.format("jdbc").options(Map("url" -> "jdbc:mysql://172.20.20.11:3306/testdepdb?user=testdep&password=testzet2018","dbtable" -> "testdepdb.partition","fetchSize" -> "20","partitionColumn" -> "seq", "lowerBound" -> "0", "upperBound" -> "10", "numPartitions" -> "5")).load()
3. 查看分区数
scala> jdbcDF.rdd.getNumPartitions
res6: Int = 5
4. 查看数据
scala> jdbc.show
+---+---------+
|seq|clicksNum|
+---+---------+
| 1| 1|
| 2| 2|
| 3| 3|
| 4| 4|
| 5| 5|
| 6| 6|
| 7| 7|
| 8| 8|
| 9| 9|
| 10| 10|
| 11| 11|
| 12| 12|
+---+---------+
5. 引入所需的库
import org.apache.spark.TaskContext
6. 打印每一行的partitionID
jdbcDF.foreach(row => {
println("partitionId:" + TaskContext.get.partitionId)
})
partitionId:3
partitionId:3
partitionId:4
partitionId:4
partitionId:4
partitionId:4
partitionId:4
partitionId:2
partitionId:2
partitionId:0
partitionId:1
partitionId:1
7. 保存为文件
scala> jdbcDF.rdd.saveAsTextFile("file///tmp/test/partition")
8. 查看文件内容
[root@dmztdep21 partition]# ls
part-00000 part-00001 part-00002 part-00003 part-00004 _SUCCESS
[root@dmztdep21 partition]# cat part-00000
[1,1]
[root@dmztdep21 partition]# cat part-00001
[2,2]
[3,3]
[root@dmztdep21 partition]# cat part-00002
[4,4]
[5,5]
[root@dmztdep21 partition]# cat part-00003
[6,6]
[7,7]
[root@dmztdep21 partition]# cat part-00004
[8,8]
[9,9]
[10,10]
[11,11]
[12,12]
参考
相关博客:
https://blog.csdn.net/wind520/article/details/52327942