hadoop学习---基于Sqoop的文件导入导出操作

在本地数据库创建数据库表:

create database sqoop_test default character set utf8;
use sqoop_test;
CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10),
`JOB` varchar(9),
`MGR` int(4),
`HIREDATE` date,
`SAL` int(7),
`COMM` int(7),
`DEPTNO` int(2),
PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800', null, '20');
INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30');
INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30');
INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', null, '20');
INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30');
INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', null, '30');
INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450', null, '10');
INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000', null, '20');
INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000', null, '10');
INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN','7698', '1981-09-08', '1500', '0', '30');
INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100', null, '20');
INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', null, '30');
INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', null, '20');
INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', null, '10');

命令:

MySQL--》HDFS

sqoop import --connect jdbc:mysql://192.168.88.101:3306/sqoop_test\--username root \
--password root \
--query 'select empno,mgr,job from emp where empno>7800 and $CONDITIONS' \
--target-dir /sqoopdata/emp --delete-target-dir -split-by empno -m 2

 1. 导出时,mysql中的表必须提前创建。
2. 导出时,字段之间的切分符号默认是逗号。如果hdfs上的文件不是逗号分隔符,需要使用--fields-terminated-by或--input-fields-terminated-by参数指定分隔符
3. 导出时,是按照hdfs上文件从左到右的顺序给mysql表的字段赋值
4. 导出时,mysql的表的字段数与hdfs上的列数可以不相同
5. 导出时,字段类型要一致
6. 带有主键约束的mysql表,要注意导出的数据的主键约束的情况,不能重复 
7. 使用--columns给mysql中的某些字段赋值时,没有包含在参数中的字段要么有默认值,要么不能设置not null
8. 在sqoop1.4.7中,hdfs上的字符串'null'是可以转成mysql中字符串类型字段的null值,
                  也可以转成mysql中非字符串类型字段的null值。

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


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


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

 

 MySQL--》Hive

sqoop import --connect jdbc:mysql://node1:3306/sqoop_test \
--username root --password root \
--table emp \
--hive-import \
--hive-overwrite \
-- hive-table 'emp3' \
-- hive-database db2

HDFS--》MySQL

sqoop export --connect jdbc:mysql://192.168.88.101:3306/sqoop_test \
--username root \
--password root \
--table emp_1 \
--export-dir /sqoop/hdfs-emp/part-m-00000 \
--input-fields-terminated-by '\t'  \
--input-null-string '\\N' \
--input-null-non-string '0' -m 1
sqoop export \
--connect jdbc:mysql://192.168.88.101:3306/sqoop_test \
--username root \
--password root \
--table emp_4 \
--export-dir /test11.txt \
--input-fields-terminated-by ','  \
--input-null-string '\\N' \
--input-null-non-string '0' \
-m 1

在Sqoop中,直接使用通配符(如*)在--export-dir后面来指定多个文件进行导出是不被支持的。Sqoop期望一个确切的目录路径,它会自动处理该目录下的所有part文件(由MapReduce任务生成)。因此,如果你想从一个目录下导出所有文件到MySQL表,你应该只指定到目录层级,而不是尝试包含通配符。

不过,如果你确实需要从一个目录下包含多个文件的场景下导出数据,通常的做法是先用Hadoop的文件系统操作命令(如hadoop fs -cathadoop fs -getmerge)来合并这些文件成一个,然后再用Sqoop进行导出。但请注意,这样做的前提是这些文件的结构和内容必须是一致的,即它们应该都是同一份数据的切片或者是完全相同结构的数据。

一个简化的流程可以是:

  1. 合并HDFS目录下的文件: 可以使用Hadoop的getmerge工具将多个part文件合并成一个临时文件。例如:

    1hadoop fs -getmerge /sqoop/hdfs-emp/part-m-* /tmp/merged_emp_data.txt

    这里假设你的part文件名为part-m-00000, part-m-00001, 等等。

  2. 使用Sqoop导出合并后的文件: 然后你可以使用这个合并后的文件作为--export-dir的输入。

    1sqoop export \
    2  --connect jdbc:mysql://192.168.88.101:3306/sqoop_test \
    3  --username root \
    4  --password root \
    5  --table emp_1 \
    6  --export-dir file:///tmp/merged_emp_data.txt \
    7  --input-fields-terminated-by '\t' \
    8  --input-null-string '\\N' \
    9  --input-null-non-string '0' \
    10  -m 1

    注意这里--export-dir现在指向的是本地文件系统上的合并文件路径。

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

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

相关文章

eslint关闭的方法总结

package.json关闭eslint 直接注释package.json文件中eslint的配置 "eslintConfig": {"root": true,此项是用来告诉eslint找当前配置文件不能往父级查找"env": {"node": true//此项指定环境的全局变量,下面的配置指定为nod…

Mysql实现双机bin-log热备份

在执行前务必停止对主服务器的mysql数据写入!!! 1.修改主机/etc/my.cnf配置,在mysqld下增加配置: log-bin mysql-bin server-id 1 2.获取MASTER_LOG_FILE、MASTER_LOG_POS信息 登录主机mysql,执行: …

【python基础】python经典题目100题

文章目录 前言初阶题目1.字符串2.列表3.元组4.字典5.运算6.random 模块7.open函数8.time模块时间9.其他 进阶题目 前言 本文主要是python经典题目100题,适合入门的新手。仅作自己学习的记录。 初阶题目 1.字符串 题目1:怎么找出序列中的最⼤最⼩值&am…

STM32使用ESP01S连接阿里云物联网平台

一、ESP01S烧录MQTT固件准备 首先准备好烧录工具,可以从官网上进行下载。 MQTT固件官网网址:AT固件汇总 | 安信可科技 (ai-thinker.com) 进去后如下图界面,向下翻找找到MQTT固件(1471)下载固件即可。 烧录工具光网地…

windows连接CentOS数据库或Tomcat报错,IP通的,端口正常监听

错误信息 数据库错误: ERROR 2003 (HY000): Cant connect to MySQL server on x.x.x.x (10060) Tomcat访问错误: 响应时间过长 ERR_CONNECTION_TIMED_OUT 基础排查工作 【以下以3306端口为例,对于8080端口来说操作是一样的,只需…

【java毕业设计】基于Spring Boot+vue的网上商城购物系统设计与实现(程序源码)-网上商城购物系统

基于Spring BootVue的网上商城购物系统设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于Spring BootVue的网上商城购物系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及论文的获取方…

Oracle闪回数据库【Oracle闪回技术】(二)

理解Oracle闪回级别【Oracle闪回技术】(一)-CSDN博客 Oracle默认是不开启闪回数据库的。如果开启闪回数据库的前提条件是,开启Oracle归档模式并启用闪回恢复区。 因为闪回日志文件存放在闪回恢复区中,如果在RAC环境下,必须将闪回恢复区存储在集群文件或者ASM文件中。 一…

揭秘APP广告变现:轻松赚取额外收入!

在移动应用(APP)的世界中,变现能力是衡量一个应用成功与否的关键指标之一。无论是个人开发者还是企业团队,如何通过应用创造收入,始终是一个备受关注的话题。今天,我们将深入探讨APP广告变现的路径&#xf…

使用nmcli命令在各Linux系统上统一的配置网络

前言:原文在我的博客网站中,持续更新数通、系统方面的知识,欢迎来访! 使用nmcli命令在各Linux系统上统一的配置网络https://myweb.myskillstree.cn/123.html 你是否会遇到在不同的Linux系统中配置网络时,修改的配置文…

Element UI 表单验证详解与实践

Element UI 作为一款流行的Vue.js UI框架,提供了丰富的表单组件和强大的表单验证功能,极大地简化了前端开发中的表单处理流程。本文将深入探讨Element UI的表单验证机制,包括基本的验证规则、自定义验证规则、以及一些高级应用场景&#xff0…

C语言初阶(6) - 指针

目录 1.指针是什么? 2. 指针和指针类型 2.1 指针 - 整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 常量指针和指针常量 (const) 4.1.常量指针 4.2.指针常量 5. 指针运算 5.1 指针-整数 5.2 指针-指针 5.3指针的关系运算 6.…

[openwrt-21.02]MT7981+MT7976 WiFi debug指令

openwrt版本信息 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/&qu…

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…

Ansible 自动化运维工具 - 了解和模块应用

目录 一. Ansible 的相关知识 1.1 Ansible 工具的简介 1.2 Ansible的四大组件 1.3 运维自动化工具 1.4 Ansible 和其它自动化运维工具对比 1.5 Ansible 的优缺点 二. Ansible 环境安装部署 2.1 管理端安装 ansible 2.2 配置主机清单 三. ansible 命令行模块 3.1 comm…

在编程中,什么是类的继承?

什么是继承 举个栗子,你是某披萨店的员工,你每天的工作就是在一张基础面饼上涂抹不同的香料制作不同的口味,假如某位顾客点了一份番茄味的香肠披萨,你可以直接在这张基础面饼上摊好香肠和番茄酱,而不是从头制作&#x…

拷贝构造、赋值运算符、运算符重载

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

Electron 报错:WinState is not a constructor

文章目录 问题分析 问题 在使用 electron-win-state 库时报错如下 代码如下: const WinState require(electron-win-state) const winState new WinState({ defaultWidth: 800,defaultHeight: 600,// other winState options, see below })const browserWindow…

京东手势验证码-YOLO姿态识别+Bézier curve轨迹拟合

这次给老铁们带来的是京东手势验证码的识别。 目标网站:https://plogin.m.jd.com/mreg/index 验证码如下图: 当第一眼看到这个验证码的时候,就头大了,这玩意咋识别??? 静下心来细想后的一个方案&#xf…

原来pip是有默认路径的。

今天一直报错: bash: /root/data1/anaconda3/envs/li_3_10/bin/pip: /root/lsc/anaconda3/envs/li_3_10/bin/python: bad interpreter: No such file or directory 原来是root/data1/anaconda3/envs/li_3_10/bin/pip: 这个位置的pip 自身带默认路径,然…