由于业务数据量日益增长,计算量非常庞大,传统的数仓已经无法满足计算需求了,所以现在基本上都是将数据放到hadoop平台去实现逻辑计算,那么就涉及到如何将oracle数仓的数据迁移到hadoop平台的问题。

这里就不得不提到一个很实用的工具——sqoop,它是一款开源的工具,主要用于实现关系型数据库与hadoop中hdfs之间的数据传递,其中用的最多的就是import,export了。

sqoop的安装配置也是非常简单的,这里就不说明了,本文主要针对如何使用sqoop实现oracle到hive(hdfs)的数据传递进行试验。

对于比较全的参数使用,可以到sqoop的官方文档http://sqoop.apache.org/docs/ 查看,以下是这次会用到的一些参数讲解:

-m N :开启N个map来导入数据

--query : 从查询结果导入数据,注意,如果使用了该参数,那么必须指定--target-dir参数,并且查询条件中要包含$CONDITIONS

--target-dir :指定数据在HDFS中的存放目录

--hive-table :导入到hive的目标表名

--fetch-size :一次从数据库中读取的记录数

--hive-drop-import-delims :将数据导入到hive时,去掉其中的\n,\r,\001等特殊字符

--null-string <null-string> :对于string类型的字段,如果值为null,那么使用<null-string>替代

--non-null-string <non-null-string> :对于非string类型的字段,如果值为null,那么使用<null-non-string>替代

(通常我们使用的是

--null-string '\\N' \

--null-non-string ‘\\N’ \

Hive中null默认是使用\N来表示的,如果想要替换成\N,那么还要多加一个\来转义)

--hive-partition-key :hive表的分区字段

--hive-partition-value :指定导入到hive表的分区对应的分区值

--hive-overwrite :覆盖重写(这里注意,如果说没有使用到--hive-partition-key,hive-partition-value,那么--hive-overwrite的使用会将整个表的数据都覆盖,反之,则只是覆盖对应的 某个分区的数据)

--verbose :打印出详细的信息

================================================================================================

这里要注意,如果你要导入的数据里面包含\n,\r,\001之类的特殊字符,那么要使用--hive-drop-import-delims去掉这些特殊字符,否则,如果字符串中有换行,那么换行符之后的数据将会被识别为另一行,导致结果不正确。

另一个需要注意的地方,如果导入的数据有些字段值是null的,要加上--null-string,--null-non-string参数,否则,这些null值将会被错误的替换为'null'这个字符串。

为了更好的说明这几个参数的重要性,下面来做一下试验:

平台说明:

Oracle    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

Hadoop  hadoop-2.7.2

Hive     hive-2.1.0

Sqoop         sqoop-1.4.6

oracle中scott用户下的数据:

说明:empno为7000,8000,9000,9001的记录中,有的是JOB这个varchar2类型的值为null,有的是MGR这个number类型的值为null,而empno为9002的记录中,JOB为\nClERK\n(前后都有换行符)。

(1)不使用sqoop的相关参数进行处理:

 sqoop import --query "select a.empno,
a.ename,
a.job,
a.mgr,
a.hiredate,
a.sal,
b.deptno,
b.dname
from emp_t1 a
left join dept_t1 b
on a.deptno = b.deptno
where /$CONDITIONS" \
--connect jdbc:oracle:thin:@192.168.134.200:1521/orclwin \
--username scott \
--password tiger \
-m 1 \
--hive-table test_db.emp_t1 \
--hive-overwrite \
19 --target-dir /sqoop/emp_t1 \
20 --hive-import

到hive中查看数据:

可见,原来的19条数据导入到hive中之后变成了21条,有两条是因为empno为9002没有正确处理其中的换行符导致的一条数据被分割成多条。

而9000和9001这两条数据的job字段值也不是NULL,而是'null'字符串:

(2)使用--hive-drop-import-delims参数处理导入数据的特殊符号,--null-string,--null-non-string处理导入数据字段值为空的情况

 sqoop import --query "select a.empno,
a.ename,
a.job,
a.mgr,
a.hiredate,
a.sal,
b.deptno,
b.dname
from emp_t1 a
left join dept_t1 b
on a.deptno = b.deptno
where /$CONDITIONS" \
--connect \ jdbc:oracle:thin:@192.168.134.200:1521/orclwin \
--username scott \
--password tiger \
-m 1 \
--hive-drop-import-delims \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-table test_db.emp_t1 \
--hive-overwrite \
--target-dir /sqoop/emp_t1 \
--hive-import

到hive中查看数据:

数据导入正常。

好啦,这个import的功能就说到这了,下一篇再说export

sqoop实现关系型数据库与hadoop之间的数据传递-import篇的更多相关文章

  1. 使用sqoop 在关系型数据库和Hadoop之间实现数据的抽取

    (一)从关系型数据库导入至HDFS 1.将下面的参数保持为 import.script import --connectjdbc:mysql://192.168.1.14:3306/test--use ...

  2. Sqoop实现关系型数据库到hive的数据传输

    Sqoop实现关系型数据库到hive的数据传输 sh脚本 #!/bin/sh v_columns=NOTE_ID_1,NOTE_NAME_1,NOTE_ID_2,NOTE_NAME_2,NOTE_ID ...

  3. sqoop将关系型数据库的表导入hive中

    1.sqoop 将关系型数据库的数据导入hive的参数说明:

  4. activity之间的数据传递方法

    1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Inte ...

  5. JSP、servlet、SQL三者之间的数据传递

    JSP.servlet.SQL三者之间的数据传递 博客分类: web开发 JSPservletSQL数据库连接池web开发  前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记, ...

  6. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  7. Activity之间的数据传递

    最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...

  8. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  9. (转载)Javascript操作表单之间的数据传递

    (转载)http://www.aspxhome.com/javascript/skills/200710/214825.htm 今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的 ...

随机推荐

  1. Javascript的RegExp对象(转载自网络)

    正则表达式是一个描述字符模式的对象. JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. '***************** ...

  2. Muduo阅读笔记---入门(一)

    第一步:下载源码和文档 下载muduo项目的源码.<muduo-manual.pdf>文档,以及<Linux多线程服务端编程:使用muduo C++网络库.pdf>,这些是前期 ...

  3. VS2008 生成静态链接库并使用

    1.启动VS2008创建一个Win32控制台程序 2.选择静态库 3.创建两个文件lib.h和lib.cpp //lib.h #ifndef LIB_H #define LIB_H int add(i ...

  4. Hawk-and-Chicken

    Hawk-and-Chicken Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...

  5. PHP基础入门(二)【PHP函数基础】

    PHP基础入门(二)--函数基础 了解 PHP基础入门详解(一) 后,给大家分享一下PHP的函数基础. 这部分主要讲的就是: 函数的声明与使用.PHP中变量的作用域.静态变量.函数的参数传递.变量函数 ...

  6. 学习笔记TF060:图像语音结合,看图说话

    斯坦福大学人工智能实验室李飞飞教授,实现人工智能3要素:语法(syntax).语义(semantics).推理(inference).语言.视觉.通过语法(语言语法解析.视觉三维结构解析)和语义(语言 ...

  7. 在.csproj文件中增加npm, bower, gulp, webpack的构建

    <Target Name="RunNpm" AfterTargets="AfterBuild">   <!-- As part of publ ...

  8. 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse。解决方法

    当在后台实现POST请求的时候,出现如下错误: 必须先将 ContentLength 字节写入请求流,然后再调用 [Begin]GetResponse. 或者是如下错误: 上述是因为由于我们使用的是代 ...

  9. 《Python数据分析常用手册》一、NumPy和Pandas篇

    一.常用链接: 1.Python官网:https://www.python.org/ 2.各种库的whl离线安装包:http://www.lfd.uci.edu/~gohlke/pythonlibs/ ...

  10. C#配合利用XML文件构建反射表机制

    在设计程序时,无论是界面或是后台代码,我们通常都想留给用户一个较为简单的接口.而我在参与封装语音卡开发函数包的时候,发现各种语音卡的底层函数的接口都是各种整形变量标记值,使用起来极为不变.于是就理解了 ...