spark通过jdbc取余分区, rdd严重数据倾斜, 大家给看看原因
spark版本2.4.5, oracle版本11.2.0.4, spark通过JDBC的方式从oracle取数据, 使用oracle rowid的方式取余, 分12个区, 方法就是这样SUBSTR(ROWID,-1)),16 , 取数据没有问题, 取回来的数据理论上应该按照16个分区生成16个RDD均匀存放吧? 现在我的情况是16个RDD分区确实生成了, 但是所有的数据都放在了0号分区, 也就是第一个分区里, 其他15个分区都是空的, 您大家帮我看看怎么回事. 还有一个问题就是取余不应该返回整数么?为什么进到rdd里的余数不是9而是9.000000000, 代码和数据如下:
jdbcDF = spark.read.format("jdbc")\
.option("driver", "oracle.jdbc.OracleDriver")\
.option("url", "jdbc:oracle:thin:@//172.28.88.26:1521/DSHIELD")\
.option("dbtable", "(SELECT MOD(ASCII(SUBSTR(ROWID,-1)),20) RN,A.* FROM CFA_PERSONBASEINFO_2 A)")\
.option("user", "FISS_NEW")\
.option("password", "FISS_NEW")\
.option("numPartitions", 16)\
.option("partitionColumn", "RN")\
.option("lowerBound", 1)\
.option("upperBound", 1000000)\
.option("fetchsize",100000)\
.load()
Row(RN=Decimal('9.0000000000'), PERSONID=Decimal('25'), NAME='王艳的', EVERNAME='25', CARDTYPE='I', CARDID='430700199308225054', BIRTHDAY='1993-08-22', SEX='M', GETJOBTIME='26', WORKINGYEARS='19', NATIONLITY='中国', BIRTHPLACE='广东揭阳', NATION='汉族', POLITY='Q', FOREIGNLANG='英语', HIGHESTDEGREE='U', HIGHSTUDY=None, TECHNICRANK='N', ADDRESS='河北省邯郸市邯山区宜都花园8号楼2单元512', POSTCODE='528248', TELEPHONE='0757-28785008', CELLPHONE='13690170786', EMAIL='hel@risingqh.com', LINKMAN='叶颖怡', LINKMANPHONE='13392231816', ADDRESSBIRTH='广州', FAMILYINFO=None, UPDATEDATE='2015-09-28', UPDATETIME='21:10:21', MODIFYID='1064818', MODIFYTYPE='M', MODIFYSTATE='X', MODIFYUSER='G01137-B02')