最近正在捣鼓构建数据仓库的事宜,正好有部分维度表的数据需要来自于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的集群机器上,不然就会出现数据导入失败的情况。
参考: