Sqoop exoprt 实战避坑(parquet格式 ,columns 参数详解)

目录

一、Parquet+Snappy 压缩格式的数据export

1.创建表 dwd_report_site_hour

2.解决方式

二、Sqoop export  columns 参数说明

1.Hive字段顺序和MySQL保持一致 

2. Sqoop export columns 中的字段顺序调整

3.测试 Sqoop export  columns 中 减少一个字段

三、总结


一、Parquet+Snappy 压缩格式的数据export

1.创建表 dwd_report_site_hour

创建分区 外部表 采用  parquet 格式 ,SNAPPY压缩

create external table if not exists dwd_report_site_hour(
sitetype string,
sitename string,
innum int,
outnum int,
datatime string,
inserttime timestamp,
modifyTime timestamp
)
partitioned by(dt string)
row format delimited
fields terminated by '\001'
stored as parquet TBLPROPERTIES('parquet.compression'='SNAPPY');

分区外部表,使用 parquet 文本格式加 SNAPPY 压缩方式存储,将  指标数据 由 Hive 数仓导入 MySQL job任务失败。

目前通过Sqoop从Hive的parquet抽数到关系型数据库的时候会报kitesdk找不到文件的错,这是Sqoop已知的问题,参考SQOOP-2907(参考):

https://issues.apache.org/jira/browse/SQOOP-2907

2.解决方式

sqoop-export --connect jdbc:mysql://192.168.2.226:3306/kangll \
--username root \
--password winner@001 \
--table dwd_report_site_hour \
--update-key sitetype,sitename \
--update-mode allowinsert \
--input-fields-terminated-by '\001' \
--hcatalog-database kangll \
--hcatalog-table dwd_report_site_hour \
--hcatalog-partition-keys dt \
--hcatalog-partition-values '20200910' \
--num-mappers 1 \
--input-null-string '\\N' \
--input-null-non-string '\\N'

参数说明:

--table                      MySQL库中的表名
--hcatalog-database          Hive中的库名
--hcatalog-table             Hive库中的表名,需要抽数的表
--hcatalog-partition-keys    分区字段
--hcatalog-partition-values  分区值
--num-mappers                执行作业的Map数

二、Sqoop export  columns 参数说明

如果不使用 column 参数,就要默认Hive 表中的字段顺序和个数和MySQL表保持一致,如果字段顺序或个数不一致可以加  columns 参数进行导出控制。

1、hive中的表字段数目和目标mysql表字段数目可以不一致,加 columns 参数
2、 hive中的表字段和目标mysql表字段名称顺序可以调整,加 columns 参数

1.Hive字段顺序和MySQL保持一致 

1.添加 id 字段 

2.MySQL 中插入两条记录

3. Hive表中添加一条记录

4.指定 columns

​
# Sqoop从Hive的parquet格式存储 抽数到关系型数据库
sqoop-export --connect jdbc:mysql://192.168.2.226:3306/kangll \
--username root \
--password kangll \
--table dwd_report_site_hour \
--update-key sitetype,sitename \
--update-mode allowinsert \
--input-fields-terminated-by '\001' \
--hcatalog-database kangll \
--hcatalog-table dwd_report_site_hour \
--hcatalog-partition-keys dt \
--hcatalog-partition-values '20200910' \
--num-mappers 1 \
--columns sitetype,sitename,innum,outnum,datatime,inserttime,modifyTime

5.查看MySQL 表 导出是否成功

2. Sqoop export columns 中的字段顺序调整

下面我调整 export 中的  columns  的顺序看能不能成功导出到MySQL 

1.Hive表中插入一条记录

2.调整 colums  中 sitetype, sitename 的字段顺序

# 与 MySQL 的字段顺序保持一致
--columns sitetype,sitename,innum,outnum,datatime,inserttime,modifyTime
# 将 sitetype, sitename 字段顺序调换
--columns sitename,sitetype,innum,outnum,datatime,inserttime,modifyTime

3.查看MySQL

3.测试 Sqoop export  columns 中 减少一个字段

1.去掉 dataTime 字段

# 与 MySQL 的字段顺序保持一致
--columns sitetype,sitename,innum,outnum,datatime,inserttime,modifyTime
# 将 sitetype, sitename 字段顺序调换
--columns sitename,sitetype,innum,outnum,datatime,inserttime,modifyTime
# 将 datatime 字段 去掉
--columns sitename,sitetype,innum,outnum,inserttime,modifyTime

2. Sqoop export columns  去掉 

​sqoop-export --connect jdbc:mysql://192.168.2.226:3306/kangll \
--username root \
--password winner@001 \
--table dwd_report_site_hour \
--update-key sitetype,sitename \
--update-mode allowinsert \
--input-fields-terminated-by '\001' \
--hcatalog-database kangll \
--hcatalog-table dwd_report_site_hour \
--hcatalog-partition-keys dt \
--hcatalog-partition-values '20200910' \
--num-mappers 1 \
--columns sitename,sitetype,innum,outnum,inserttime,modifyTime

3.hive 表中再插入一条数据

三、总结

1.对于 hive   Parquet+Snappy 格式的数据导出 ,使用 hcatalog 参数, 如果不使用 ,可以采用 另外一种方式解决,将 Hive 表数据查询出来放到 HDFS 临时目录,然后 get 到 本地,使用 MySQL load file 方式,这种方式 显然比较麻烦,但SQL 对表字段内容处理支持很好,更灵活。

2.Sqoop export 中  columns  参数 可以让 Hive表中的字段 和MySQL 表中的字段对应,如果 Hive导入的 某个字段缺少,则默认给 NULL。

猜你喜欢

转载自blog.csdn.net/qq_35995514/article/details/108542495
今日推荐