我正在尝试将mysql中的数据导入hive(cloudera5.8集群),其中包含4个hdfs数据节点。使用sqoop1.4.6(包含在cloudera5.8中)我一直在尝试直接从mysql导入hive,除了..我的mysql表(innodb格式)中的所有十进制(18,2)字段总是作为hive字符串数据类型导入,这显然是错误的。下面是我的sqoop bash(在centos 6.7上)脚本:
sqoop import --null-string '\\N' --null-non-string '\\N' --hive-delims-replacement '\0D' --fields-terminated-by '\001' --connect jdbc:mysql://xxx.xxx.xxx/live_data --username (user_name) --password 'xxxxxx' --table (table name) --hive-import --hive-database (hive_database) --hive-table (table name) --target-dir "(target directory)" --as-parquetfile --hive-overwrite --map-column-hive 'price=DECIMAL\(18%2C2\)'
这个 map-column-hive
似乎是允许的(也就是说,没有错误,尽管我在1.4.7中读到了修复程序),并且我已经用“%2c”代替了逗号(当您直接使用“,”时会出现错误)。
我已经检查了hive decimal类型,似乎支持18,2的大小(cloudera5.1+)。我尝试了许多变体:使用双引号而不是单引号,使用
("-null-string '\\N' --null-non-string '\\N' --hive-delims-replacement '\0D' --fields-terminated-by '\001'")
这对xml数据非常有帮助(另一个表,在我使用这些设置之前把数据弄脏了)。
我也尝试过减少数字的数量(例如8,2),但是不管我做什么,我似乎从mysql得到的小数都被转换成了hive字符串类型,这对于数值聚合函数来说是非常糟糕的。
我已经考虑过将我的sqoop升级到1.4.7,但是在编译之后运行它时出现了错误,这是一个单独的问题。出于某种原因 map-column-hive
参数被忽略或不起作用。
有没有人能回答我怎样才能让这个正确地从十进制(18,2)导入到配置单元十进制(18,2)或至少是一个带2个小数位的较短数字。
谢谢大家!
1条答案
按热度按时间vxbzzdmp1#
sqoop import+parquet+decimal已损坏。这里是avro的固定地址:https://issues.apache.org/jira/browse/sqoop-1493
你可以试着转换成双重使用
--map-column-hive
.