最近正在捣鼓构建数据仓库的事宜,正好有部分维度表的数据需要来自于RDBMS的数据,在HADOOP环境最流行的莫过于Apache的Sqoop工具,按官方的文档操作下来也很顺畅的,不过当要应用到业务场景上时问题便出现了。
在Hive上面创建了一个Dimension表并用ORC格式储存(关于Hive ORC存储的介绍参考
Hive:ORC File Format存储格式详解
),然后在执行Sqoop导入便会抛出下面的异常:
1
| FAILED: SemanticException Unable to load data to destination table. Error: The file that you are trying to load does not match the file format of the destination table.
|
经过几番测试后发现,Sqoop默认导入的数据格式为TXTFILE,所以当建表时使用TXTFILE存储格式就能正常的导入数据,但这不是我们所想要的,又查看了一下文档,发现其在1.4.5版本后提供了一个hcatalog命令是可以支持ORC File Format
,参考命令如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
| sqoop import
--connect jdbc:mysql://master01:3306/data_pipeline
--username dw
--password-file hdfs:///user/hdfs/dw.txt
--table dim_calendar
--split-by ek_cal_id
--compress
--fields-terminated-by ","
--lines-terminated-by "\n"
--hcatalog-database default
--hcatalog-table dim_calendar
--map-column-hive cal_date=DATE,ts=TIMESTAMP
--hcatalog-storage-stanza 'stored as orc tblproperties ("orc.compress"="SNAPPY")'
|
从上面命令可以看出后续可以自由的定义存储格式及压缩格式,不过这边还有个问题会有个告警,如下:
1
2
| WARN hcat.SqoopHCatUtilities: Column cal_date had to be cast to a less precise type DATE in hcatalog
WARN hcat.SqoopHCatUtilities: Column ts had to be cast to a less precise type TIMESTAMP in hcatalog
|
这个问题暂时没有办法解决,HIVE好像还支持这两种类型的数据格式,后面再跟进一下看看。
执行Sqoop命令时一下要记得切换到同时安装有Sqoop Client与Hive Client的集群机器上,不然就会出现数据导入失败的情况。
参考: