大数据备忘录———将数据从oracle导入impala中
上周遇到了将数据从oracle导入到impala的问题,这个项目耽误了我近一周的时间,虽然是种种原因导致的,但是还是做个总结。
需求首先是跑数据,跑数据这个就不叙述,用的是公司的平台。
讲讲耽误我最久的事吧 数据的导入导出。
将数据从oracle导出
PLSQL直接导出
我这边连接公司的orcle数据库是PLSQL,本身PLSQL就是可以可以导出数据的,而且很简单。
PLSQL在select后就能导出表的数据,能到处成csv、sql、xml等等。
但是这方法最后还是被舍弃了,有几个原因:
1.这种导出方法很慢,我导出200M的csv数据需要40分钟
2.数据导出有限制,这种方法好像最多只能导出104w数据,但是需求是需要导出1亿两千万的数据,很明显是不可以的。
注:中间我考虑过按分区导出数据,因为这个表是按时时间分了分区,然后发现还是不行,因为数量还是太大了,30天的数据平均下来每个还是有400w,最后放弃了
事实证明这个方法不是很好用,导出几百、几天还行。多了就不行了。
使用oracle的内建包UTL_FILE
第二种用orcle里面用utl_file读写文件包 ,每分钟大约处理百万行。适用于大量导出时。
一、首先需要新建一个存储过程
CREATE
OR REPLACE PROCEDURE SQL_TO_CSV (
P_QUERY IN VARCHAR2,-- PLSQL文
P_DIR IN VARCHAR2,-- 导出的文件放置目录
P_FILENAME IN VARCHAR2 -- CSV名
) IS L_OUTPUT UTL_FILE.FILE_TYPE; L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR; L_COLUMNVALUE VARCHAR2 (4000); L_STATUS INTEGER; L_COLCNT NUMBER := 0; L_SEPARATOR VARCHAR2 (1); L_DESCTBL DBMS_SQL.DESC_TAB; P_MAX_LINESIZE NUMBER := 32000; BEGIN
--OPEN FILE
L_OUTPUT := UTL_FILE.FOPEN (
P_DIR,
P_FILENAME,
'W',
P_MAX_LINESIZE
); --DEFINE DATE FORMAT
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS'''; --OPEN CURSOR
DBMS_SQL.PARSE (
L_THECURSOR,
P_QUERY,
DBMS_SQL.NATIVE
); DBMS_SQL.DESCRIBE_COLUMNS (
L_THECURSOR,
L_COLCNT,
L_DESCTBL
); --DUMP TABLE COLUMN NAME
FOR I IN 1 ..L_COLCNT
LOOP
UTL_FILE.PUT (
L_OUTPUT,
L_SEPARATOR || '"' || L_DESCTBL (I ).COL_NAME || '"'
); --输出表字段
DBMS_SQL.DEFINE_COLUMN (
L_THECURSOR,
I,
L_COLUMNVALUE,
4000
); L_SEPARATOR := ','; END
LOOP
; UTL_FILE.NEW_LINE (L_OUTPUT);--输出表字段
--EXECUTE THE QUERY STATEMENT
L_STATUS := DBMS_SQL. EXECUTE (L_THECURSOR); --DUMP TABLE COLUMN VALUE
WHILE (
DBMS_SQL.FETCH_ROWS (L_THECURSOR) > 0
)
LOOP
L_SEPARATOR := ''; FOR I IN 1 ..L_COLCNT
LOOP
DBMS_SQL.COLUMN_VALUE (
L_THECURSOR,
I,
L_COLUMNVALUE
); UTL_FILE.PUT (
L_OUTPUT,
L_SEPARATOR || '"' || TRIM (
BOTH ' '
FROM
REPLACE (L_COLUMNVALUE, '"', '""')
) || '"'
); L_SEPARATOR := ','; END
LOOP
; UTL_FILE.NEW_LINE (L_OUTPUT); END
LOOP
; --CLOSE CURSOR
DBMS_SQL.CLOSE_CURSOR (L_THECURSOR); --CLOSE FILE
UTL_FILE.FCLOSE (L_OUTPUT); EXCEPTION
WHEN OTHERS THEN
RAISE; END; /
二、创建导出路径
create or replace directory OUT_PATH as 'D:\out_path';
注意:这步只是在oracle sql developer中定义了导出路径,如果路径不存在,并不会自动生成,需要手动去新建!
三、调用数据
EXEC sql_to_csv('select * from <tablename>','OUT_PATH','<filename>');
这种是在网上查到的方法,这边因为最近公司规定不能下载到本地所以没有采用这种方法,但是这种方法测试是可行的,没有具体测试效率。
sqluldr服务器导出数据
第三种是我最后采用的方法
用sqluldr脚本导出到服务上,然后把文件转移到impala的服务器上去。
下载链接链接:https://pan.baidu.com/s/1bRRr-BDQL0yIJJTa16ttTw
提取码:1tns
将sqluldr.rar中文件上传到orcle所在服务器中,然后执行
./sqluldr2_linux64_10204.binuser= query="" field=',' text=txt file='' charset=UTF8;
file='' 是存放路径 charset=编码 user=是orcle数据库地址 query=是导出语句
然后执行效率100w大概40秒左右,速度比较快。
数据上传到impala中
1、将数据从oracle服务器转移到impala所在服务器
2、在hive中建好导出数据的表
CREATE TABLE tmp.tmp_call_orcle_1 (
test string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' --csv分隔符
STORED AS TEXTFILE; --设置文件为test文件
3、用hdfs命令将数据导入到建好的表中:hdfs dfs -put test.csv /user/hive/warehouse/tmp.db/test
4、将表的读取路径改成hdfs路径
load data inpath '/user/hive/warehouse/tmp.db/tmp_call_orcle_1/tmp_call_orcle_1.csv' into table tmp.tmp_call_orcle_1;
至此就完成了将orcle数据导入impala的操作
最新文章
- 项 目 管 理 知 识 体 系 指 南 (PMBOK2008)
- 国内网站常用的一些 CDN 公共库加速服务
- C# lambda表达式及初始化器
- 微信小程序开发公测,小程序账号申请办法攻略
- 初学java之(盒子分布)
- #获取本机IP地址时排除IPv6类型,只返回IPv4地址的方法
- Android WebRTC 音视频开发总结(四)-- webrtc传输模块
- Ant-关键元素(笔记一)
- ARM MIPS PowerPC比较
- asp.net mvc4中自定义404页面
- window忘记密码怎么办
- VC档(夹)文件夹路径的经营方针和代码
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
- VxWorks下USB驱动总结1
- Java面试通关秘籍汇总集
- js jquery 函数回调
- 纯css3开发的响应式设计动画菜单(支持ie8)
- 【转】使用expect实现shell自动交互
- jdbc 小结
- Java并发(一):多线程干货总结
热门文章
- linux终端相关概念解释及描述
- 使用ice-plugin-fusion给icedesign的模板加个主题(theme)
- JAVA图形小动画之简单行星运动
- shell中命令代换$()与`` 、 变量代换${} 、 整数运算$(( )) 的区别
- INNER JOIN连接两个表、三个表、五个表的SQL语句
- 事务四大特性(ACID)
- Leetcode题目75.颜色分类(双指针-中等)
- nginx优化后的主配置文件
- LC 802. Find Eventual Safe States
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-3.微信Oauth2.0交互流程讲解