运用sqoop将数据从oracle导入到hive中有哪些坑
小编给大家分享一下运用sqoop将数据从oracle导入到hive中有哪些坑,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
成都创新互联是一家从事企业网站建设、成都做网站、成都网站制作、行业门户网站建设、网页设计制作的专业网络公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点上千多家。
1.选择个别列来进行导入 使用--columns参数即可
2.指定符合条件的数据 使用 --where参数即可,可以使用oracle中的参数,比如我就使用了to_date('2013-06-20','yyyy-MM-dd')函数来指定日期导入
3.sqoop中指定列分隔符 使用 --fields-terminated-by参数即可
4.文件存放位置的指定 使用--target-dir参数即可,不过文件夹是sqoop自己新建的,已存在的话会报异常。有时分了好几次任务,想导入到同一个文件夹,可使用 --append参数。不用担心两次任务会生成同名的文件从而导致失败,因为当你加入--append参数时,sqoop会先在当前用户目录下生成临时的 文件夹来存放运行结果,然后根据你指定的存放位置,再将结从临时文件夹剪切到你所指定的文件夹,他会自动更改文件名从而避免重复。
5.想启动多个map任务运行 一般而言直接使用--m参数即可,他会默认根据你所导入表的主键来进行分片,也就是他默认使用--split-by 你的主键 来进行分片, 过程就是取你的主键的最大值和最小值,然后用获得的差值来除以你所设的map任务数,这样会得到每个map任务所处理的数据范围。 看起来很美妙,其实中间有许多不足,首先你若没有主键,则你必须手动指定--split-by参数,或者你不进行并行执行任务,设置-m 1 。还有的不足就是此次遇到的数据倾斜问题,比如我设置-m 4,可我的主键比如最小值1000,最大值10000,可我只有100条数据,其中大部分都分布在主键范围为1000~2000的区域,这下四个map任务分别对应的区间大概为1000~3250,3250~5500,5500~7750,7750~10000。可见,数据 集中在第一个map任务上,其余三个完全没有数据,这样非但没有并行执行的速度,一定程度上还有影响速度。所以split-by如何选择,要根据实际情况来选择。
6.如何用date类型的列来作为split-by参数值 此次任务我发现还是使用date类型的列作为分片值比较均匀,可当我直接使用--split-by 我的日期列 的时候,报错 java.sql.SQLDataException: ORA-01861: literal does not match format string 网上google得知,大意是一个版本bug 解决方案大致为转换成string类型即可,网址为 https://issues.apache.org/jira/browse/SQOOP-1946。我的解决方案为 --split-by "to_char(我的日期列,'yyyy-MM-dd')"
7.导入的列有换行符如何解决 本以为万事大吉,万万没想到导入的列有nclob类型,里面存储了一篇篇文章,势必有着换行符。果不其然,hive查询数据全部错乱, 查询资料发现--hive-delims-replacement(替换\n,\r等符号用你指定的字符)和--hive-drop-import-delims参数。可添加上去发现并没有什么卵用,没有起作用。百度goole很久,终于发现一篇帖子,http://stackoverflow.com/questions/28076200/hive-drop-import-delims-not-removing-newline-while-using-hcatalog-in-sqoop 意思是要用--map-column-java参数来显示指定列为String类型。我的解决方案为 --map-column-java 我的CLOB列=String 果然,问题解决,换行符全部被去掉。
看完了这篇文章,相信你对“运用sqoop将数据从oracle导入到hive中有哪些坑”有了一定的了解,如果想了解更多相关知识,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
本文名称:运用sqoop将数据从oracle导入到hive中有哪些坑
文章URL:http://ybzwz.com/article/gcjpgd.html