温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

1.问题描述

通过sqoop抽取Mysql表数据到hive表,发现hive表所有列显示为null

Hive表的分隔符为“u001B”,sqoop指定的分隔符也是“u001B”

通过命令show create table test_hive_delimiter查看建表语句如下:

0: jdbc:hive2://localhost:10000/> show create table test_hive_delimiter;

...

INFO : OK

+----------------------------------------------------+--+

| createtab_stmt |

+----------------------------------------------------+--+

| CREATE EXTERNAL TABLE `test_hive_delimiter`( |

| `id` int, |

| `name` string, |

| `address` string) |

| ROW FORMAT SERDE |

| 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' |

| WITH SERDEPROPERTIES ( |

| 'field.delim'='\u0015', |

| 'serialization.format'='\u0015') |

| STORED AS INPUTFORMAT |

| 'org.apache.hadoop.mapred.TextInputFormat' |

| OUTPUTFORMAT |

| 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' |

| LOCATION |

| 'hdfs://ip-172-31-6-148.fayson.com:8020/fayson/test_hive_delimiter' |

| TBLPROPERTIES ( |

| 'COLUMN_STATS_ACCURATE'='false', |

| 'numFiles'='0', |

| 'numRows'='-1', |

| 'rawDataSize'='-1', |

| 'totalSize'='0', |

| 'transient_lastDdlTime'='1504705887') |

+----------------------------------------------------+--+

22 rows selected (0.084 seconds)

0: jdbc:hive2://localhost:10000/>

发现Hive的原始建表语句中的分隔符是“u001B”而通过show create table test_hive_delimiter命令查询出来的分隔符为“u0015”,分隔符被修改了。

2.问题复现

1.创建Hive表test_hive_delimiter,使用“u001B”分隔符

create external table test_hive_delimiter

(

id int,

name string,

address string

)

row format delimited fields terminated by '\u001B'

stored as textfile location '/fayson/test_hive_delimiter';

2.使用sqoop抽取MySQL中test表数据到hive表(test_hive_delimiter)

[root@ip-172-31-6-148 ~]# sqoop import --connect jdbc:mysql://ip-172-31-6-148.fayson.com:3306/fayson -username root -password 123456 --table test -m 1 --hive-import --fields-terminated-by "\0x001B" --target-dir /fayson/test_hive_delimiter --hive-table test_hive_delimiter

数据抽取成功:

[root@ip-172-31-6-148 ~]# hadoop fs -ls /fayson/test_hive_delimiter

Found 2 items

-rw-r--r-- 3 fayson supergroup 0 2017-09-06 13:46 /fayson/test_hive_delimiter/_SUCCESS

-rwxr-xr-x 3 fayson supergroup 56 2017-09-06 13:46 /fayson/test_hive_delimiter/part-m-00000

[root@ip-172-31-6-148 ~]# hadoop fs -ls /fayson/test_hive_delimiter/part-m-00000

-rwxr-xr-x 3 fayson supergroup 56 2017-09-06 13:46 /fayson/test_hive_delimiter/part-m-00000

[root@ip-172-31-6-148 ~]#

3.查看test_hive_delimiter表数据

[root@ip-172-31-6-148 ~]# beeline

Beeline version 1.1.0-cdh5.12.1 by Apache Hive

beeline> !connect jdbc:hive2://localhost:10000/;principal=hive/ip-172-31-6-148.fayson.com@FAYSON.COM

...

Transaction isolation: TRANSACTION_REPEATABLE_READ

0: jdbc:hive2://localhost:10000/> select * from test_hive_delimiter;

...

INFO : OK

+-------------------------+---------------------------+------------------------------+--+

| test_hive_delimiter.id | test_hive_delimiter.name | test_hive_delimiter.address |

+-------------------------+---------------------------+------------------------------+--+

| NULL | NULL | NULL |

| NULL | NULL | NULL |

| NULL | NULL | NULL |

+-------------------------+---------------------------+------------------------------+--+

3 rows selected (0.287 seconds)

0: jdbc:hive2://localhost:10000/>

4.Hive表的建表语句如下

3.解决方法

分隔符“u001B”为十六进制,而Hive的分隔符实际是八进制,所以在使用十六进制的分隔符时会被Hive转义,所以出现使用“u001B”分隔符创建hive表后显示的分隔符为“u0015”。

在不改变数据文件分隔符的情况下,要先将十六进制分隔符转换成八进制分隔符来创建Hive表。

1.将十六进制分隔符转换为八进制分隔符

“u001B”转换八进制为“033”,在线转换工具:http://tool.lu/hexconvert/

2.修改建表语句使用八进制“033”作为分隔符

create external table test_hive_delimiter

(

id int,

name string,

address string

)

row format delimited fields terminated by '\033'

stored as textfile location '/fayson/test_hive_delimiter';

使用命令show create table test_hive_delimiter查看建表语句

0: jdbc:hive2://localhost:10000/> show create table test_hive_delimiter;

...

INFO : OK

+----------------------------------------------------+--+

| createtab_stmt |

+----------------------------------------------------+--+

| CREATE EXTERNAL TABLE `test_hive_delimiter`( |

| `id` int, |

| `name` string, |

| `address` string) |

| ROW FORMAT SERDE |

| 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' |

| WITH SERDEPROPERTIES ( |

| 'field.delim'='\u001B', |

| 'serialization.format'='\u001B') |

| STORED AS INPUTFORMAT |

| 'org.apache.hadoop.mapred.TextInputFormat' |

| OUTPUTFORMAT |

| 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' |

| LOCATION |

| 'hdfs://ip-172-31-6-148.fayson.com:8020/fayson/test_hive_delimiter' |

| TBLPROPERTIES ( |

| 'COLUMN_STATS_ACCURATE'='false', |

| 'numFiles'='0', |

| 'numRows'='-1', |

| 'rawDataSize'='-1', |

| 'totalSize'='0', |

| 'transient_lastDdlTime'='1504707693') |

+----------------------------------------------------+--+

22 rows selected (0.079 seconds)

0: jdbc:hive2://localhost:10000/>

3.查询test_hive_delimiter表数据

0: jdbc:hive2://localhost:10000/> select * from test_hive_delimiter;

...

INFO : OK

+-------------------------+---------------------------+------------------------------+--+

| test_hive_delimiter.id | test_hive_delimiter.name | test_hive_delimiter.address |

+-------------------------+---------------------------+------------------------------+--+

| 1 | fayson | guangdong |

| 2 | zhangsan | shenzheng |

| 3 | lisi | shanghai |

+-------------------------+---------------------------+------------------------------+--+

3 rows selected (0.107 seconds)

0: jdbc:hive2://localhost:10000/>

将十六进制的”u001B”转换为八进制的”033”建表,问题解决。

4.备注

Hive建表时使用十六进制分割符需要注意,部分分隔符会被转义(如:001B/001C等)

Sqoop指定十六进制分隔符,为什么是“0x001B”而不是“u001B”,可参考Sqoop

醉酒鞭名马,少年多浮夸! 岭南浣溪沙,呕吐酒肆下!挚友不肯放,数据玩的花!

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

hive 十六进制转十进制_0026-Hive使用十六进制分隔符异常分析相关推荐

  1. hive 十六进制转十进制_Hive使用十六进制分隔符异常分析

    温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.问题描述 通过sqoop抽取Mysql表数据到hive表,发现hive表所有列显示为null Hive表的分隔符为"\u0 ...

  2. 在c语言中 十六进制转十进制,C语言中十六进制转十进制两种实现方法

    C语言 · 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英文字母A.B.C.D.E.F表示. 样 ...

  3. 8位十六进制转换32位十六进制_网络中的数制系统--二进制十六进制与十进制之间的相互转换...

    网络中计算机的32位IPv4地址以二进制显示,也会以点分十进制显示.而IPv6的地址是128位,是由数字和A-F组成的十六进制系统.因此,了解并且学会在其三者之间相互转换是非常重要的,让我们能够更好的 ...

  4. Python 十六进制,十进制转换

    1. 十进制转十六进制 hex(number) 2. 十六进制转十进制 hex(number) 3. 十六进制字符串转十进制 int(number,16) 4. 十六进制字符串转十六进制 hex(in ...

  5. 十进制转二进制,八进制,十六进制(PHP)

    <?php #使用:$var=e(数字,进制); function e($v,$l){ if($v>0&&in_array($l,array(2,8,16))){    $ ...

  6. hive 十六进制转十进制_hive 常用运算

    第一部分:关系运算 Hive支持的关系运算符 •常见的关系运算符 •等值比较: = •不等值比较: <> •小于比较: < •小于等于比较: <= •大于比较: > •大 ...

  7. IEEE-754标准(32位) 十六进制转换十进制浮点数

    因实验需要,读取陀螺仪的数据是16进制的数据,需要将该数据转化为10进制方便自己查看,理解.记录如下: 1.将(32位)16进制IEEE-754标准浮点数就是用十六进制表示浮点,称为单精度浮点数. f ...

  8. 十进制转换成十六进制c语言 链栈,C语言 链栈 实现十进制转换二进制,八进制,十六进制...

    C语言 链栈 实现十进制转换二进制,八进制,十六进制 (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 最后运行结果:代码:#incl ...

  9. python【蓝桥杯vip练习题库】BASIC-11 十六进制转十进制

    试题 基础练习 十六进制转十进制 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的1 ...

最新文章

  1. matlab 二次指数平滑法预测
  2. 读秦小波《设计模式之禅》 -- 单例模式
  3. 操作系统实验2—实现动态分区分配模拟程序
  4. pycharm 如何导入、导出设置?
  5. HDU 3333 Turing Tree(树状数组+离线处理+离散化)
  6. vb循环 Do While…Loop 语句/Do Until…Loop语句
  7. jasmine.objectContaining 的单步调试
  8. java workerdone_【架构】Java并发编程——线程池的使用
  9. Manacher算法图解
  10. django-数据的插入-利用pymysql
  11. detected idea启动 web_IDEA使用Tomcat服务器出现乱码问题排查过程
  12. 有向图生成树个数(bzoj 4894: 天赋)
  13. android 检测摇一摇
  14. H5 通过Ajax方式上传文件,使用FormData进行Ajax请求
  15. 情人节表白代码(爱心+炫动字体)
  16. AXI协议中的BURST
  17. PDF怎么转换成图片?来看这两种好用的方法
  18. linux命名空间(namespace)学习(一)
  19. VUE+Element学习笔记之登录页面跳转首页
  20. 为用户提供确定性——互联网平台建设

热门文章

  1. 北漂不易,逆风前行[给想在北京工作的java同学们诚恳的建议!]
  2. JAVA设计一个汽车类Vehicle,包含的属性有车轮个数wheels和车重weight
  3. Android 中 activity 窗口模式的实现
  4. 虞小约Java之旅第三天(Java中的运算符)
  5. qt 取textedit 鼠标位置处单词_开源国产优麒麟20.04 V3发布:多达73处改进
  6. 什么是工作流?如何利用工作流引擎实现业务流程
  7. 为何选计算机应用专业,计算机应用专业的为什么要还学电工电子技术啊?
  8. 正好线上炒股导火索龙头翻倍了
  9. 必须收藏:访问学者在美国生活常用软件介绍
  10. 笔记本电池使用误区及正确保养