文章目录

  • 1. 导入数据
  • 1.1 RDBMS -> HDFS
  • 1.1.1 全部导入
  • 1.1.2 查询导入
  • 1.1.3 导入指定列
  • 1.1.4 使用sqoop关键字筛选查询导入数据
  • 1.2 RDBMS -> Hive
  • 1.2.1 普通导入
  • 1.2.2 增量导入(incremental append)
  • 1.2.3 增量导入(incremental lastmodified)
  • 1.3 RDBMS -> HBase
  • 2. 导出数据


1. 导入数据

在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。

1.1 RDBMS -> HDFS

1.1.1 全部导入

sqoop import \
--connect jdbc:mysql://topnpl200:3306/topdb_dev \
--username root \
--password TOPtop****** \
--table test_table \
--target-dir /during/sqoop_test \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

# delete-target-dir目录存在,删除后导入

# 查看
hdfs dfs -cat /during/sqoop_test/*

1.1.2 查询导入

sqoop import \
--connect jdbc:mysql://topnpl200:3306/topdb_dev \
--username root \
--password TOPtop****** \
--target-dir /during/sqoop_test \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name from test_table where id <2 and $CONDITIONS;'
# 尖叫提示:must contain '$CONDITIONS' in WHERE clause.     
# 尖叫提示:如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。

1.1.3 导入指定列

sqoop import \
--connect jdbc:mysql://topnpl200:3306/topdb_dev \
--username root \
--password TOPtop****** \
--target-dir /during/sqoop_test \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,update_time \
--table test_table
# 尖叫提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格

1.1.4 使用sqoop关键字筛选查询导入数据

sqoop import \
--connect jdbc:mysql://topnpl200:3306/topdb_dev \
--username root \
--password TOPtop****** \
--target-dir /during/sqoop_test \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table test_table \
--where "id=2"
# 尖叫提示:在Sqoop中可以使用sqoop import -D property.name=property.value这样的方式加入执行任务的参数,多个参数用空格隔开。

1.2 RDBMS -> Hive

1.2.1 普通导入

sqoop import \
--connect jdbc:mysql://topnpl200:3306/topdb_dev \
--username root \
--password TOPtop****** \
--table test_table \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table during.sqoop_hive

注:
1、sqoop_hive表如果没有的话,会自动创建。
2、从MySQL到HDFS的默认路径为/user/root/,如这里为/user/root/test_table。当导入完成后,该目录会删除。
3、该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库。从MySQL到Hive,本质时从MySQL => HDFS => load To Hive

报错:
ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.

解决:

# vim /etc/profile
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
# source /etc/profile

1.2.2 增量导入(incremental append)

sqoop import \
	--connect jdbc:mysql://topnpl200:3306/topdb_dev \
	--username root \
	--password TOPtop****** \
	--table stu_hive \
	--num-mappers 1 \
	--fields-terminated-by "\t" \
	--target-dir /user/hive/warehouse/sqoop_append_import \
	--check-column id \
	--incremental append \
	--last-value 1010

注:
1、append不能与–hive-等参数同时使用(Append mode for hive imports is not yet supported. Please remove the parameter --append-mode)
2、–last-value 2 的意思是标记增量的位置为第二行,也就是说,当数据再次导出的时候,从id=3的开始导入。
3、如果 --last-value N , N > MySQL中最大行数,则HDFS会创建一个空文件。如果N<=0 , 那么就是所有数据。

1.2.3 增量导入(incremental lastmodified)

# 先在mysql中建表并插入几条数据:
mysql> create table staff_timestamp(id int(4), name varchar(255), sex varchar(255), last_modified timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
mysql> insert into staff_timestamp (id, name, sex) values(1, 'AAA', 'female');
mysql> insert into staff_timestamp (id, name, sex) values(2, 'BBB', 'female');

# 先导入一部分数据:
sqoop import \
--connect jdbc:mysql://topnpl200:3306/topdb_dev \
--username root \
--password TOPtop****** \
--table staff_timestamp \
--delete-target-dir \
--hive-import \
--fields-terminated-by "\t" \
--m 1

# 再增量导入一部分数据:
mysql> insert into staff_timestamp (id, name, sex) values(3, 'CCC', 'female');

sqoop import \
--connect jdbc:mysql://topnpl200:3306/topdb_dev \
--username root \
--password TOPtop****** \
--table staff_timestamp \
--check-column last_modified \
--incremental lastmodified \
--m 1 \
--last-value "2019-09-15 16:26:05" \
--append

注:
1、使用lastmodified方式导入数据要指定增量数据是要–append(追加)还是要–merge-key(合并)
2、在Hive中,如果不指定输出路径,可以去看以下两个目录/user/root(此为用户名)或 user/hive/warehouse 个人配置的目录。
3、last-value指定的值是会包含于增量导入的数据中。

1.3 RDBMS -> HBase

详见 HBase(六)—— HBase集成Sqoop

2. 导出数据

在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。

导出到MySQL时,如果MySQL表不存在,不会自动创建。

sqoop export \
--connect jdbc:mysql://topnpl200:3306/topdb_dev?characterEncoding=utf-8 \
--username root \
--password TOPtop****** \
--export-dir /user/hive/warehouse/during.db/stu \
--table stu_hive \
--num-mappers 1 \
--input-fields-terminated-by "\t"