问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请教spark通过jdbc读取大量数据

发布网友 发布时间:2022-05-01 09:04

我来回答

2个回答

懂视网 时间:2022-05-01 13:26

@Test 2 public void test() throws IOException { 3 BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream("C:\Users\yhzh\Desktop\zh_20160913"))); 4 String tmp=null; 5 List<String> nos=new ArrayList<String>(); 6 while((tmp=reader.readLine()) !=null) 7 nos.add(tmp); 8 9 Connection con = null;// 创建一个数据库连接 10 PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement 11 PreparedStatement pre2 = null; 12 ResultSet result = null;// 创建一个结果集对象 13 BufferedWriter csvWriter=null; 14 try 15 { 16 String tag=(new SimpleDateFormat("hhmmss")).format(new Date()); 17 csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\Users\yhzh\Desktop\贷后还款计划_"+tag+".csv")), "utf-8")); 18 19 Class.forName("oracle.jdbc.driver.OracleDriver"); 20 //:6006/hotfix 21 String url = "jdbc:oracle:thin:@//*.*.*.*:16030/zcgl",user = "*",password = "*"; 22 con = DriverManager.getConnection(url, user, password);// 获取连接 23 String sql="select max(lr_id) from t_loan_request where LR_REQUESTSTATUS =‘2‘ and lr_applyid=?"; 24 /*String sql = 27 "select req.LR_APPLYID,CURR_PERIODS,REPAY_DAY, " + 28 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL, " + 29 "PERIOD_REPAY_AMOUNT " + 30 "from( " + 31 " select lr_id,LR_APPLYID from t_loan_request t " + 32 " where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘ " + 33 " order by lr_id desc)req " + 34 "left join t_repay_plan rp " + 35 "on req.lr_id=rp.lr_id " + 36 "order by req.lr_id,CURR_PERIODS ";// 预编译语句,“?”代表参数*/ 37 pre = con.prepareStatement(sql); 38 pre2=con.prepareStatement("select CURR_PERIODS,REPAY_DAY, " + 39 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL, " + 40 "PERIOD_REPAY_AMOUNT " + 41 "from t_repay_plan " + 42 "where lr_id=? " + 43 "order by CURR_PERIODS"); 44 for(String no:nos){ 45 pre.setString(1,no); 46 result = pre.executeQuery(); 47 if(result.next()) { 48 long lrId=result.getLong(1); 49 pre2.setLong(1,lrId); 50 result = pre2.executeQuery(); 51 while (result.next()) { 52 csvWriter.write(no); 53 csvWriter.write(","); 54 csvWriter.write(result.getString(1)); 55 csvWriter.write(","); 56 csvWriter.write(result.getString(2)); 57 csvWriter.write(","); 58 csvWriter.write(result.getString(3)); 59 csvWriter.write(","); 60 csvWriter.write(result.getString(4)); 61 csvWriter.newLine(); 62 } 63 } 64 } 65 66 csvWriter.flush(); 67 } 68 catch (Exception e) 69 { 70 e.printStackTrace(); 71 } 72 finally 73 { 74 try 75 { 76 if(csvWriter !=null) 77 csvWriter.close(); 78 if (result != null) 79 result.close(); 80 if (pre != null) 81 pre.close(); 82 if (con != null) 83 con.close(); 84 System.out.println("数据库连接已关闭!"); 85 } 86 catch (Exception e) 87 { 88 e.printStackTrace(); 89 } 90 } 91 }

先读取所有编号形成List,后遍历这个List,先查出id再查详细数据。这样的数据csv文件中大约8万多条

一条条的来肯定慢,如果不按照编号,直接一次查出,数据是9万多条。速度都很慢!!!

后来想提高下,至少要有个明显的提升呀。写文件这块基本排除了,剩下的疑问就是ResultSet是否拿到了所有结果呢?

根据网上查到的资料和实际调试,得出答案:ResultSet默认一次取10条数据,怪不得要慢,如果一次全部读入内存再写入文件就一定很快了。

怎样一次读取所有数据呢?

sql改为读取全部

 1 String sql="select req.LR_APPLYID,CURR_PERIODS,REPAY_DAY,
" +
 2 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,
" +
 3 "PERIOD_REPAY_AMOUNT 
" +
 4 "from(
" +
 5 " select lr_id,LR_APPLYID from t_loan_request t 
" +
 6 " where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘
" +
 7 " order by lr_id desc)req
" +
 8 "left join t_repay_plan rp
" +
 9 "on req.lr_id=rp.lr_id
" +
10 "order by req.lr_id,CURR_PERIODS";

 

设置PreparedStatement:

1 pre = con.prepareStatement(sql);
2 pre.setFetchSize(100000);
3 result = pre.executeQuery();
4 //result.setFetchSize(100000);

主要是PreparedStatement的 setFetchSize 方法,

后来发现ResultSet也有个setFetchSize 方法,也是可行的,只是这个时候resultset中已经有了10条记录直到循环10次后,再次使用result.next()才去取100000,fetchSize才起作用

这样设置后速度飞快!!!

 

jdbc--取大量数据

标签:

热心网友 时间:2022-05-01 10:34

Hadoop(大数据分析领域无可争辩的王者)专注于批处理。这种模型对许多情形(比如为网页建立索引)已经足够,但还存在其他一些使用模型,它们需要来自高度动态的来源的实时信息。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
菜豆矮化病毒病传毒介体是什么? 菜豆曲矮花叶病毒病是怎样进行病害的检验与检疫? 菜豆矮化病毒病是怎么进行病害的检验与检疫? 菜豆夏枯病毒病病原特性是什么? 菜豆畸矮病毒病有怎样的病原特性? 菜豆矮化病毒病有什么症状? 菜豆曲矮花叶病毒病病原的特性是什么? 宾得K30可用的最便宜的长焦镜头 有位朋友推荐了神备e金融平台,据说炒股专业,不知道是不是真的? 有位朋友推荐了神备e金融平台,据说炒股非常的专业,不知道是不是真_百度... 红烧小黄鱼的家常做法 吉比特路由器的界面网址是怎么登陆的? 请问有哪位大神知道吉比特gs2101的超级管理密码,我想用自己的路由器拨号。如何设置 吉比特路由器怎么设置? 意识形态的根本属性是什么 白条黑漂老是没有鱼 渔纳多黑钢台钓竿硬度怎么样 钓鱼需要的是耐性,晒一点怕什么 谁给推荐个耐用的抄网 港华路高桥垂钓中心,真的那么黑吗?去不起!!为我朋友气愤, 这什么牌子抄网 穿新鞋不舒服,脚上起了大水泡,到底要不要挑破? 钓鱼狂拉是什么意思 长江流域电鱼黑色产业链曝光,该支持电鱼入刑吗? 脚上起泡可以挑破吗 如果脚烧起泡了可以把泡挑开吗 脚上起泡了可以用针挑破吗? 怎样能好得快些? 梦见自己用抄网的反面扣住了一条黑色的蛇。是什么意思? 抄网是什么 钓鱼抄网为什么都是黑色的 男性退休年龄最新规定 天翼云电脑在哪投屏- 问一问 红烧小黄鱼家常做法,正宗红烧小黄鱼怎么做 说书唱戏劝人方,三条大道走*。 善恶到头终有报,人间正道是沧桑。 净水器工作原理PPT模板 武松和度牒行走江湖的时候应该如何报号? 男的什么时候退休年龄 《三侠剑》有几个版本? 为什么演义和评书比正史更能让人认为是史实?像岳飞的精忠报国和尽忠报国,三国演义等等。 郭德纲有段评书 讲的楼金庭恩将仇报,薛财主的故事。叫什么名字? 为什么演义和评书比正史更能让人认为是史实?像岳飞的精忠报国和尽忠报国,三国演义等等。 红色Aj皮鞋外表发黑怎么办? aj1 鞋面上小黑点怎么办 洗不掉? aj1黑爆裂应该用什么清洗 10月份应该穿什么衣服合适 十月份天亮大概几点 AJ1小禁穿被踩黑,我用泡沫清洗剂洗了,现在鞋头发白,颜色变淡了,请问还有什么办法能恢复啊? 沈阳哪有卖比熊的? 哪里有卖比熊犬? 我今天在58上面看见一个卖比熊的,说是自家养的小狗下的崽,400块钱一只,可以去家里看小狗,我现在