当数据量很大时,读取方式
dbtable写sql语句
dbtable和query配置不能同时存在,选一种即可。里面都可以直接写sql语句
jdbcDF = spark.read.format("jdbc")\.option("driver",driver)\.option("url",url)\.option("dbtable","(select * from my_table where class='01' and sex='M' )")\.option("user",user)\.option("password",password)\.load().select("org_code","operate_id")
如果dbtable是一个表,如果load()后进行where和select,都会把整张表加载进来,耗内存。直接写sql语句比较好。
并行方式读取数据库
一般来说,默认读数据库,numPartition是1。
以下代码使得读取数据库并行读是10。
jdbcDF = spark.read.format("jdbc")\.option("driver",driver)\.option("url",url)\.option("dbtable","(select * from my_table where class='01' and sex='F' )")\.option("user",user)\.option("password",password)\.option("numPartitions",10)\.option("partitionColumn","id")\.option("lowerBound",0)\.option("upperBound",100000).load().select("org_code","operate_id")
numPartitions是设置的最大分区数。(单独设置这一选项,没有设置partitionColumn,lowerBound,upperBound,我怎么试实际运行numPartitions值都是1。大概是spark不知道怎么分割分区)
partitionColumn,lowerBound,upperBound这三个选项必须同时设置。(upperBound-lowerBound)/numPartitions是步长。即使数据内容低于lowerBound,或高于upperBound,依然会把所有数据都加载进来。
比如设置partitionColumn为id列,lowerBound为100,upperBound为400,numPartitions为3,实际内容有小于100的,也有大于300的。
那么第一个分区是低于200的,第二个分区是[200,300),第三个分区是大于等于300的
partitionColumn列的值必须是numeric, date, 或 timestamp类型的。
如果是date类型,可以写.option("lowerBound","2023-01-01")
如果是timestamp类型,可以写.option("lowerBound","2023-01-01 00:00:00")