Sqoop和Hive数据仓库笔记
Sqoop常用命令
基本操作命令
命令 | 说明 |
---|---|
import | 将关系型数据库数据导入到HDFS、HIVE、HBASE |
export | 将HDFS上的数据导出到关系型数据库 |
codegen | 获取数据库中某张表数据生成java并打成jar包 |
create-hive-table | 创建hive表 |
eval | 查询SQL的执行结果 |
list-databases | 列出所有数据库 |
list-tables | 列出某个数据库下的所有表 |
help | 打印sqoop帮助信息 |
version | 打印sqoop版本信息 |
连接参数
参数 | 描述 |
---|---|
--connect | 指定JDBC连接字符串 |
--connection-manager | 指定要使用的连接管理器类 |
--driver | 指定要使用的JDBC驱动类 |
--hadoop-mapred-home | 指定$HADOOP_MAPRED_HOME路径 |
--password-file | 设置密码文件路径 |
-P | 从控制台读取密码 |
--username | 设置认证用户名 |
--verbose | 打印运行信息 |
常用操作示例
数据库操作
查看所有数据库:
sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456
查看表列表:
sqoop list-tables --connect jdbc:mysql://localhost:3306/hive_meta --username root --password 123456
数据导入
全量导入到HDFS:
sqoop import --connect jdbc:mysql://master:3306/onlinedb --username root --password 123456 \
--delete-target-dir --target-dir /sqooptest --table goods --m 1
带分隔符导入:
sqoop import --connect jdbc:mysql://master:3306/onlinedb --username root --password 123456 \
--delete-target-dir --target-dir /sqooptest --table goods --fields-terminated-by '\t'
Hive集成
创建Hive表并导入:
bash
sqoop create-hive-table --connect jdbc:mysql://master:3306/onlinedb --table goods \
--username root --password 123456 --hive-table default.test
sqoop import --connect jdbc:mysql://master:3306/onlinedb --table goods --username root \
--password 123456 --hive-import --hive-table default.test
Hive配置与使用
Hiveserver2配置
初始化元数据库:
bash
schematool -initSchema -dbType mysql
启动服务:
bash
hiveserver2 &
beeline -u jdbc:hive2://master:10000 -n root
表类型对比
类型 | 特点 | 存储位置 |
---|---|---|
内部表 | 删除表时同时删除数据 | hive.metastore.warehouse.dir |
外部表 | 删除表保留数据 | 用户自定义路径 |
分区表 | 按分区字段存储数据 | 分区目录结构 |
分桶表 | 数据分桶存储 | 分桶文件 |
表创建语法
sql
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT], ...)]
[PARTITIONED BY (col_name data_type, ...)]
[CLUSTERED BY (col_name) INTO num_buckets BUCKETS]
[ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n']
[STORED AS file_format]
[LOCATION 'hdfs_path']
数据操作
动态分区配置:
sql
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
INSERT OVERWRITE TABLE student_dyna PARTITION(age)
SELECT * FROM student;
JSON数据处理:
sql
SELECT GET_JSON_OBJECT('{"level":"2"}', '$.level') AS level
数据导出
Hive到本地/HDFS:
sql
INSERT OVERWRITE [LOCAL] DIRECTORY '/root/output'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
SELECT * FROM goods;
命令行执行:
bash
hive -e "SELECT * FROM table"
hive -f /path/to/query.hql
增量导入
追加模式示例:
bash
sqoop import --connect jdbc:mysql://master:3306/onlinedb --username root --password 123456 \
--table goods --target-dir /appenresult --incremental append --check-column gid --last-value 1205