分组对列扁平化(列转换行 关系型转换NoSQL)
来源:互联网 发布:怎么提高手机网络速度 编辑:程序博客网 时间:2024/06/11 13:37
前言:
关系型数据库要符合第一范式即原子性,因此字段多值情况只能分行处理,如下表,假设keys是terms、appl_dt,则no, predict_pay_dt, actual_pay_dt 是多值
如果要转换成NoSQL或collection对象,需要以keys分组,然后列转成行(或列转成collection)。
ETL开源工具Kettle也有行扁平化,不过不能分组进行,功能有限。
现以Java实现,示例:
public static List<Fpd> columnToLine(Connection conn) {List<Fpd> fpdList = new ArrayList<Fpd>();Fpd preFpd = new Fpd();Fpd fpd = new Fpd();List<Integer> preAgrList = new ArrayList<Integer>();List<Integer> agrList = new ArrayList<Integer>();List<Integer> preDefList = new ArrayList<Integer>();List<Integer> defList = new ArrayList<Integer>();List<Integer> preDefDaysList = new ArrayList<Integer>();List<Integer> defDaysList = new ArrayList<Integer>();ResultSet rs = selectValue(conn);try {while(rs.next()){// 1. copy current line to previous linetry {preFpd = DeepCopy.copy(fpd);preAgrList = DeepCopy.copy(agrList);preDefList = DeepCopy.copy(defList);preDefDaysList = DeepCopy.copy(defDaysList);} catch (Exception e) {e.printStackTrace();}// 2. assign current linefpd = new Fpd();fpd.setMobileNo(rs.getString("mobile_no"));fpd.setName(rs.getString("name"));fpd.setLoanAmount(rs.getInt("loan_amount"));fpd.setTerms(rs.getInt("terms"));fpd.setApplDt(rs.getString("appl_dt"));fpd.setZhangdanNo(rs.getInt("zhangdan_no"));agrList.add(rs.getInt("ARG"));defList.add(rs.getInt("DEF"));defDaysList.add(rs.getInt("DEF_days"));// 3. if group by keys are different, update recordif (preFpd.getMobileNo() != null && !fpd.keysEquals(preFpd)) {preFpd.setAgr(preAgrList);preFpd.setDef(preDefList);preFpd.setDefDays(preDefDaysList);fpdList.add(preFpd);agrList.clear();defList.clear();defDaysList.clear();agrList.add(rs.getInt("ARG"));defList.add(rs.getInt("DEF"));defDaysList.add(rs.getInt("DEF_days"));}}// 4. final process (copy current line & update record){try {preFpd = DeepCopy.copy(fpd);preAgrList = DeepCopy.copy(agrList);preDefList = DeepCopy.copy(defList);preDefDaysList = DeepCopy.copy(defDaysList);} catch (Exception e) {e.printStackTrace();}preFpd.setAgr(preAgrList);preFpd.setDef(preDefList);preFpd.setDefDays(preDefDaysList);fpdList.add(preFpd);}} catch (SQLException e) {e.printStackTrace();}return fpdList;}
附上转成行后的表批量插入(关系型):
public static void insertValue(Connection conn, List<Fpd> fpdList) { String sql = "insert into def_analysis (" + "mobile_no, name, amount, terms, appl_dt, " + "AGR_1, AGR_2, AGR_3, AGR_4, AGR_5, AGR_6, " + "AGR_7, AGR_8, AGR_9, AGR_10, AGR_11, AGR_12, " + "DEF_1, DEF_2, DEF_3, DEF_4, DEF_5, DEF_6, " + "DEF_7, DEF_8, DEF_9, DEF_10, DEF_11, DEF_12, " + "DEF_DAYS_1, DEF_DAYS_2, DEF_DAYS_3, DEF_DAYS_4, DEF_DAYS_5, DEF_DAYS_6, " + "DEF_DAYS_7, DEF_DAYS_8, DEF_DAYS_9, DEF_DAYS_10, DEF_DAYS_11, DEF_DAYS_12" + ") values(?, ?, ?, ?, ?, " + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? " + ")"; try { PreparedStatement ps = conn.prepareStatement(sql); conn.setAutoCommit(false); for (Fpd fpd:fpdList) { ps.setString(1,fpd.getMobileNo()); ps.setString(2,fpd.getName()); ps.setInt(3,fpd.getAmount()); ps.setInt(4,fpd.getTerms()); ps.setString(5,fpd.getApplDt()); Iterator<Integer> agrItr = fpd.getAgr().iterator(); for(int i = 6; i<18; i++) { if (agrItr.hasNext()) ps.setInt(i,agrItr.next()); else ps.setInt(i,0); } Iterator<Integer> defItr = fpd.getDef().iterator(); for(int i = 18; i<30; i++) { if (defItr.hasNext()) ps.setInt(i,defItr.next()); else ps.setInt(i,0); } Iterator<Integer> defDaysItr = fpd.getDefDays().iterator(); for(int i = 30; i<42; i++) { if (defDaysItr.hasNext()) ps.setInt(i,defDaysItr.next()); else ps.setInt(i,0); } ps.addBatch(); } ps.executeBatch(); conn.commit(); conn.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); } }
注意:
previous 对象要用值传递而不能地址传递,DeepCopy可参考:http://blog.csdn.net/textboy/article/details/49075263
0 0
- 分组对列扁平化(列转换行 关系型转换NoSQL)
- 行转换列(mssql)
- Sql 行转换列(列转换行), JavaScript解决思路
- SQL行转换成列
- oracle列转换为行
- oracle列转换为行
- SQL转换行和列
- Mysql行转换为列
- 数据库列转换为行
- DataTable实现行转换列
- 行列转换(列转行)
- sqlserver2005 中行列转换
- Excel 列的转换
- 列转行-行列转换
- ORACLE字符串转换列
- oracle 中行列转换
- sql中行列转换
- Hive中行列转换
- 第七周--项目一--建立环形队列算法库
- 第七周项目1-建立顺序环形队列算法库
- oracle视图
- 栈的链式存储结构及其基本运算实现
- Android ImageCropper 矩形 圆形 裁剪框
- 分组对列扁平化(列转换行 关系型转换NoSQL)
- 牛客网 | 二叉树的镜像
- yii学习笔记-代码流程
- ListView、ScrollView中嵌套的EditText不能滚动的问题
- 如何将Nios II硬件和软件合成一个文件(NIOS II)(硬件)(软件)(合并)
- ViewPager 的 PagerIndicator
- 关于操作栏actionBar的添加移除总结
- Android Studio系列教程四--Gradle基础
- 源码安装postgresql