sqoop导入实战

news2024/11/26 13:48:49

Sqoop导入实战

Sqoop-import

案例1

表没有主键,需要指定map task的个数为1个才能执行

Sqoop导入原理:

​ Sqoop默认是并行的从数据库源导入数据。您可以使用-m或--num-mappers参数指定用于执行导入的map任务(并行进程)的数量。每个参数都取一个整数值,该整数值对应于要使用的并行度。默认情况下,使用四个任务。一些数据库可以通过将这个值增加到8或16来改善性能。

​ 默认情况下,Sqoop将标识表中的主键id列用作拆分列。从数据库中检索分割列的高值和低值,map任务操作整个范围的大小均匀的组件。譬如ID的范围是0-800,那么Sqoop默认运行4个进程,通过执行 SELECT MIN(id), MAX(id) FROM emp找出id的范围,然后把4个任务的id设置范围是(0-200),(200-400),(400-600),(600-800)

但是当一个表没有主键时,上面的切分就无法进行,Sqoop导入时就会出错,这时候可以通过-m把mapper的数量设为1,只有一个Mapper在运行,这时候就不需要切分,也可以避免主键不存在时候报错的问题.

#错误信息
ERROR tool.ImportTool: Import failed: No primary key could be found for table emp. Please specify one with --split-by or perform a sequential import with '-m 1'.

复制代码

导入代码:

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--table emp -m 1
复制代码

DBMS-HDFS

案例2

表没有主键,使用--split-by指定执行split的字段

问题同上,如果表没有主键,那么还有个办法就是手工指定要拆分的列,通过--split-by来指定

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--table emp \
--split-by empno \
--delete-target-dir \
--target-dir hdfs://qianfeng01:8020/sqoopdata/emp
复制代码
-- 出错
Caused by: java.sql.SQLException: null,  message from server: "Host 'qianfeng01' is not allowed to connect to this MySQL server"
复制代码

解决方案:

先连接MySql:

[root@qianfeng01 sqoop-1.4.7]# mysql -uroot -p
复制代码

(执行下面的语句 .:所有库下的所有表 %:任何IP地址或主机都可以连接)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysql' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
复制代码

案例3:条件导入(增量导入)

需要导入的数据不是全部的,而是带条件导入

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--table emp \
--split-by empno \
--where 'empno > 7777' \
--target-dir hdfs://qianfeng01:8020/sqoopdata/emp
复制代码

案例4:部分字段导入

要导入的数据,不想包含全部字段,只需要部分字段

注意:这种跟where差不多,使用时更灵活一些

[root@qianfeng01 sqoop-1.4.7] bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--split-by empno \
--query 'select empno,ename,job from emp where empno > 7777 and $CONDITIONS' \
--target-dir hdfs://qianfeng01:8020/sqoopdata/7
复制代码

DBMS-Hive

案例5:将数据导入到Hive中

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb 
--username root 
--password 123456
--table emp 
--hive-import 
-m 1
复制代码

DBMS-HBase

把数据导入到HBase中

hbase中创建表:
create 'mysql2hbase','info'

# 方法一:
[root@qianfeng01 sqoop-1.4.7]# sqoop import  --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table emp \
--hbase-table mysql2hbase \
--column-family info \
--hbase-create-table \
--hbase-row-key empno \
-m 1 \


注意:如果使用的是Hbase2.X版本以上,那么需要添加依赖(1.6版本的依赖),不然会出现如下错误

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.HBaseAdmin.<init>(Lorg/apache/hadoop/conf/Configuration;)V

下载安装包:https://archive.apache.org/dist/hbase/1.6.0/
操作方式:将1.6版本的Hbase的依赖lib全部拉去到Sqoop对应文件夹lib下面,再次执行上面的命令

测试:
hbase(main):008:0> scan 'mysql2hbase'
ROW                                      COLUMN+CELL
 1                                       column=info:hobby, timestamp=1585852383291, value=1
 1                                       column=info:profile, timestamp=1585852383291, value=\xE6\xBC\x94\xE5\x91\x98
 1                                       column=info:uname, timestamp=1585852383291, value=bingbing
 2                                       column=info:hobby, timestamp=1585852383291, value=2
 2                                       column=info:profile, timestamp=1585852383291, value=\xE6\xBC\x94\xE5\x91\x98
 2                                       column=info:uname, timestamp=1585852383291, value=feifei
 3                                       column=info:hobby, timestamp=1585852383291, value=1
 3                                       column=info:profile, timestamp=1585852383291, value=\xE5\x94\xB1\xE6\xAD\x8C
 3                                       column=info:uname, timestamp=1585852383291, value=\xE5\x8D\x8E\xE4\xBB\x94
3 row(s) in 2.2770 seconds


# 方法二:
hbase(main):004:0> create 'mysql2hbase11','info'
[root@qianfeng01 sqoop-1.4.7]# sqoop import  --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table emp \
--hbase-table mysql2hbase11 \
--delete-target-dir \
--column-family info \
--hbase-create-table \
--hbase-row-key empno \
-m 1 \
--hbase-bulkload 

运行后在结尾处有结果(Trying to load hfile):
s20/04/03 10:41:11 WARN mapreduce.LoadIncrementalHFiles: Skipping non-directory hdfs://qianfeng01:8020/user/root/user_info/_SUCCESS
h20/04/03 10:41:12 INFO hfile.CacheConfig: CacheConfig:disabled
a20/04/03 10:41:12 INFO mapreduce.LoadIncrementalHFiles: Trying to load hfile=hdfs://qianfeng01:8020/user/root/emp/info/1aef7d02d1a646008f18d49cbb23f20f first=1 last=3


注:
-- hbase-bulkload 不用输入路径,会自己默认导出到某目录,然后完成后自行装载数据到hbase表中;
-m 需要再--hbase-bulkload之前出现

# 测试:
hbase(main):004:0> scan 'mysql2hbase1'
ROW                                      COLUMN+CELL
 1                                       column=info:hobby, timestamp=1585881667767, value=1
 1                                       column=info:profile, timestamp=1585881667767, value=\xE6\xBC\x94\xE5\x91\x98
 1                                       column=info:uname, timestamp=1585881667767, value=bingbing
 2                                       column=info:hobby, timestamp=1585881667767, value=2
 2                                       column=info:profile, timestamp=1585881667767, value=\xE6\xBC\x94\xE5\x91\x98
 2                                       column=info:uname, timestamp=1585881667767, value=feifei
 3                                       column=info:hobby, timestamp=1585881667767, value=1
 3                                       column=info:profile, timestamp=1585881667767, value=\xE5\x94\xB1\xE6\xAD\x8C
 3                                       column=info:uname, timestamp=1585881667767, value=\xE5\x8D\x8E\xE4\xBB\x94
3 row(s) in 0.6170 seconds

复制代码

增量导入数据

使用场景

  1. 经常被操作不断产生数据的表,建议增量。
  2. 当某表基数很大,但是变化很小,也建议增量

使用方式A

  1. query where : 能精确锁定数据范围

  2. incremental : 增量,最后记录值来做的

query where方式

通过查询具体日期的方式进行导入

新建一个脚本文件

mysql中的表格:
 CREATE TABLE qfdb.sales_order(
    orderid INT PRIMARY KEY,
    order_date DATE
    )
[root@qianfeng01 sqoop-1.4.7] vi ./import.sh
复制代码

写入以下内容:

#!/bin/bash
# yesterday=`date -d "1 days ago" "+%Y-%m-%d"`
yesterday=$1
sqoop import --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--query "select * from sales_order where DATE(order_date) = '${yesterday}' and \$CONDITIONS" \
--delete-target-dir \
--target-dir /user/hive/warehouse/sales_order/dt=${yesterday} \
-m 1 \
--fields-terminated-by '\t' 
复制代码

执行

[root@qianfeng01 sqoop-1.4.7]# bash import.sh 2019-02-01
复制代码

通过下面HDFS可以快速查询到结果:

 [root@qianfeng01 sqoop-1.4.7]# hdfs dfs -cat /user/hive/warehouse/sales_order/dt=2019-01-01/pa*
复制代码

increment的append方式

#将会手动维护last-value 
[root@qianfeng01 sqoop-1.4.7]# sqoop import --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table sales_order \
--driver com.mysql.jdbc.Driver \
--target-dir /user/hive/warehouse/sales_order1/dt=2019-12-30 \
--split-by order_id \
-m 1 \
--check-column order_number \
--incremental append \
--last-value 800 \
--fields-terminated-by '\t'
复制代码
注意:--last-value 80000 \  从80000开始检查,如果后面有新的数据就会进行增量导入,如果没有新的数据会提示下面的信息
21/12/12 01:52:16 INFO tool.ImportTool: Incremental import based on column order_date
21/12/12 01:52:16 INFO tool.ImportTool: No new rows detected since last import.
复制代码

使用下面命令查看:

[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -cat /user/hive/warehouse/sales_order1/dt=2019-12-30/pa*
复制代码

导入填充空值数据

[root@qianfeng01 ~]# sqoop import --connect jdbc:mysql://localhost:3306/qfdb --username root --password 123456 --table emp --delete-target-dir --target-dir hdfs://qianfeng01:9820/sqoopdata/emp --null-string '\\N' --null-non-string '0'
复制代码

关键参数

--null-string '\\N'  ## 遇到空字符串会填充\N字符
--null-non-string '0' # 遇到空数字会填充0

 更多大数据精彩内容欢迎B站搜索“千锋教育”或者扫码领取全套资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件工程题库】第六章 编码和测试

&#x1f57a;作者&#xff1a; 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Python基础(15)——Python字典(dict)详解

Python基础&#xff08;15&#xff09;——Python字典&#xff08;dict&#xff09;详解 文章目录 Python基础&#xff08;15&#xff09;——Python字典&#xff08;dict&#xff09;详解课程&#xff1a;字典目标一. 字典的应用场景二. 创建字典的语法三. 字典常见操作3.1 增…

arm64架构的linux中断分析(一)

文章目录 1. 中断的概念和作用2. Linux中断处理机制2.1 中断请求2.2 中断处理2.3 中断完成2.4.中断触发和处理步骤详解2.4.1 异常向量表的解读 2.5 硬件中断号和软件中断号 1. 中断的概念和作用 当计算机的CPU需要在执行任务的同时响应外部事件时&#xff0c;中断是一种重要的…

Python基础(13)——Python列表(list)详解

Python基础&#xff08;13&#xff09;——Python列表&#xff08;list&#xff09;详解 文章目录 Python基础&#xff08;13&#xff09;——Python列表&#xff08;list&#xff09;详解课程&#xff1a;列表目标一. 列表的应用场景二. 列表的格式三. 列表的常用操作3.1 查找…

持 PMP®证书增持 CSPM-2证书,值不值?

2023年起&#xff0c;持有PMP证书的朋友可以直接增持一个同等级证书CSPM-2&#xff0c;不用重新考试&#xff0c;不用重新学习&#xff0c;原PMP证书不影响正常使用&#xff0c;相当于多了一个国标项目管理领域的证书。 第一步准备资料 1、填写能力评价表(简历和业绩不用填&am…

ChatGPT批量生成文章软件:创意无限,内容源源不断

ChatGPT是一种基于人工智能技术的自然语言处理模型&#xff0c;它能够生成各种主题的文章。这种软件具有创意无限、内容源源不断的特点&#xff0c;能够满足用户对于大量文章的需求。 方面一&#xff1a;文化艺术 ChatGPT软件可以生成关于文化艺术的文章&#xff0c;包括绘画、…

C++基础入门教程(2)

3 运算符 作用&#xff1a; 用于执行代码的运算 本章我们主要讲解以下几类运算符&#xff1a; 运算符类型 作用 算术运算符 用于处理四则运算 赋值运算符 用于将表达式的值赋给变量 比较运算符 用于表达式的比较&#xff0c;并返回一个真值或假值 逻辑运算符 用于根据表达式的…

DevExpress WPF功能区控件,更轻松创建商业应用工具栏!(下)

在上文中(点击这里回顾>>&#xff09;&#xff0c;我们主要介绍了DevExpress WPF的Ribbon、Toolbar和Menus组件支持MVVM、功能区命令栏和视图等&#xff0c;本文将继续介绍这些组件的自定义功能等。 DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超…

行业报告 | 生成式人工智能:人人可用的新时代

原创 | 文 BFT机器人 01 人工智能的发展迎来新拐点 ChatGPT 正在唤醒全球对人工智能 (AI)变革潜力的认知&#xff0c;激发起前所未有的关注和创造力浪潮。 该技术可以模仿人类的对话和决策能力&#xff0c;使我们站上了公众采用人工智能的第一个真正拐点。最终&#xff0c;所有…

k8s volume简单总结 —— 筑梦之路

Kubernetes目前支持的Volume类型包括Kubernetes的内部资源对象类型、开源共享存储类型、存储厂商提供的硬件存储设备和公有云提供的存储等。 将Kubernetes特定类型的资源对象映射为目录或文件&#xff0c;包括以下类型的资源对象&#xff1a; 类型描述ConfigMap应用配置Secret加…

WPF开发txt阅读器15:C#合并段落

文章目录 清理空格段落拼接去除空行按键事件 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录&#x1f48e;快捷键翻页字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显…

Cell -- PARADIGM算法可预测药物与微生物组的关联关系

在癌症患者中&#xff0c;药物对肠道细菌群的影响很难确定。以往的研究主要关注抗生素对肠道微生物组的影响&#xff0c;而对非抗生素药物的影响在人体中了解较少&#xff0c;这是由于缺乏可靠的药物暴露数据和长期粪便样本的收集。 2023年6月8日发表于《Cell》的“High-resolu…

2023年北京/上海/深圳DAMA-CDGA/CDGP数据治理工程师认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【openGauss基本概念---快速入门】

【openGauss简单使用---快速入门】 &#x1f53b; 一、基本概念&#x1f530; 1.1 openGauss&#x1f530; 1.2 数据库&#xff08;Database&#xff09;&#x1f530; 1.3 数据块&#xff08;Block&#xff09;&#x1f530; 1.4 行&#xff08;Row&#xff09;&#x1f530; …

Live800:企业如何提高服务数据可用性?

数据是现代企业的重要资源&#xff0c;蕴含着巨大的商业价值是企业运用科学管理、决策分析的基础。近几年来“大数据”一词的热度有目共睹&#xff0c;各行业根据自身特点和需求不断探索符合行业特性的大数据应用场景。那么对客服行业来说&#xff0c;大数据将对客户服务将产生…

基于C/S框架的医院LIS实验室检验系统源码

LIS系统功能 一、字典管理模块&#xff1a; 系统参数功能简介&#xff1a;集中设置系统使用过程中所需的参数值&#xff0c;一般由开发或实施人员进行设置。 标本管理功能简介&#xff1a;标本管理是对检验业务中涉及的检验标本类型进行初始化设置&#xff0c; …

详解浮点数

目录 1.什么是浮点数 2.举个例子 2.1.十进制转二进制 2.2.规范尾数位 2.3.计算指数位 2.4.拼接结果 3.精度丢失 4.JAVA中的浮点数思考 1.什么是浮点数 在计算机系统的发展过程中&#xff0c;曾经提出过多种方法表示实数&#xff0c;但是到为止使用最广泛的是浮点表示法…

sqoop导出实战

Sqoop导出实战 普通导出 在Sqoop中,使用export进行导出,指的是从HDFS中导出数据到MySql中&#xff1a; 构建MySql的表&#xff1a; CREATE TABLE u2 (id int(11) DEFAULT NULL,age int(11) DEFAULT 0 ) ENGINEInnoDB DEFAULT CHARSETutf8; 复制代码 HDFS导出到MySql 第一…

LabVIEW开发基于脑机接口的航空航天相机载体

LabVIEW开发基于脑机接口的航空航天相机载体 脑机接口是人脑与外部世界之间的直接通信渠道。脑机接口是一个全新的人机界面系统。该系统获取和分析生物电信号&#xff0c;目标是直接在大脑和外部设备之间创建一个通信通道。计算机或微处理器的发展提高了复杂的数据处理能力。生…

SolidWorks如何批量转换文件为最新版?

对于 SOLIDWORKS 的每个新版本&#xff0c;文件格式都会更新以适配最新的性能升级。当您每次打开旧版本 SOLIDWORKS 文件时&#xff0c;都会显示一条消息&#xff0c;通知您这是一个较旧的文件。保存文件时&#xff0c;必须先将文件转换为最新版本&#xff0c;然后再保存。这个…