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='[email protected]', LINKMAN='葉穎怡', LINKMANPHONE='13392231816', ADDRESSBIRTH='廣州', FAMILYINFO=None, UPDATEDATE='2015-09-28', UPDATETIME='21:10:21', MODIFYID='1064818', MODIFYTYPE='M', MODIFYSTATE='X', MODIFYUSER='G01137-B02')
uj5u.com熱心網友回復:
為什么進到rdd里的余數不是9而是9.000000000 因為你用的是Oracle的函式 回傳decimalMOD(ASCII(SUBSTR(ROWID,-1)),20) 你這段看得我云里霧里,為什么要模20?
val numPartition = 16
jdbcDF = spark.read.format("jdbc")\
.option("driver", "oracle.jdbc.OracleDriver")\
.option("url", "jdbc:oracle:thin:@//172.28.88.26:1521/DSHIELD")\
.option("dbtable", s"(SELECT MOD(ASCII(SUBSTR(ROWID,-1)),${numPartition}) RN,A.* FROM CFA_PERSONBASEINFO_2 A)")\
.option("user", "FISS_NEW")\
.option("password", "FISS_NEW")\
.option("numPartitions", numPartition)\
.option("partitionColumn", "RN")\
.option("lowerBound", 0)\
.option("upperBound", numPartition)\
.option("fetchsize",100000)\
.load()
試試
uj5u.com熱心網友回復:
mod20是為了分20個區, 好并行讀資料, 現在已經確定了, 是upperbound的問題, 也是改成了跟你推薦的一樣磁區數. 現在遇到另外一個問題, spark讀資料很快, 處理rdd也很快, 但是加工完資料以后再寫入oracle的時候, 會嚴重擁堵, 有沒有什么好辦法可以spark均勻寫入
uj5u.com熱心網友回復:
觀察一下寫入Oracle的時候有多少個Task(磁區)。過大不好。在df.write前,改成df.repartition(xx).write會好很多。具體多少,要看你Oracle的性能。建議改成小于其他訪問Oracle應用的JDBC連接池最大連接數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10978.html
標籤:Spark
