hiveudf分割ASCII的STX、ETX(^B、^C)

ETX、STX

STX (start of text),正文开始 ,ETX (end of text),正文结束

 

STXETX只是为了便于描述。其实STX用来描述16进制中的02这个字节,而ETX则是03ETX只是为了便于描述。其实STX用来描述16进制中的02这个字节,而ETX则是03

vim编辑器打开的话显示^B、^C

一次采集上来的数据就是这种格式,为拆成kv的形式做了如下处理

现将此文件上传到hdfs,并建立对应的表

第一种方案:使用hivesql、sparksql内置的函数里的split,

按\u0002已经分成了一对对的kv,但是没有拿出具体的k、v,kv还是绑在一起的,没法分别提出k 和v,所以只能写kdf

第二种方案:使用udf(暂用python演示,java一样)

代码如下

        vim get1.py

# -*- coding: utf-8 -*-

import sys

for line in sys.stdin:

    #分解出一对对kv

    detail = line.split("\x02")

    #解析每一对kv并存值

    for kv1 in detail:

kv=kv1.split("\x03")

if len(kv)==2 and kv[0]=="aaa":

                aaa=kv[1]

        if len(kv)==2 and kv[0]=="bbb":

                bbb=kv[1]

        if len(kv)==2 and kv[0]=="ccc":

                ccc=kv[1]    

        if len(kv)==2 and kv[0]=="ddd":

                ddd=kv[1]   

 

    print("\t".join(["aaa",aaa,"bbb",bbb,"ccc",ccc,"ddd",ddd]))

将get1.py放到 hiveserver2所在节点 /home/hive路径下,

beeline -u jdbc:hive2://$sparkthritserver:10016 -n hive

0: jdbc:hive2://node113.leap.com:10016> select *  from testa;
+-------------------------------------------------------------------+--+
|                                str                                |
+-------------------------------------------------------------------+--+
| aaa1528441180664bbbclientccc1528441184822ddd1528441184823  |
| aaa1528441180664bbbclientccc1528441184822ddd1528441184823  |

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

0: jdbc:hive2://node113.leap.com:10016> add file get1.py;
+---------+--+
| Result  |
+---------+--+
+---------+--+

No rows selected (0.047 seconds)

 

 

 

第三种方案(最佳方案):

其实这些数据都是map的结构,建议用hive的str_to_map解决

map<string,string>

str_to_map(text[, delimiter1, delimiter2])

Splits text into key-value pairs using two delimiters. Delimiter1 separates text into K-V pairs, and Delimiter2 splits each K-V pair. Default delimiters are ',' for delimiter1 and '=' for delimiter2.

ETX/STX分别对应分隔符"\u0002"和"\u0001",然后map取值即可

案例1:

hive> 

    > select str_to_map('aaa:11&bbb:22', '&', ':')
    > from tmp.tmp_jzl_20140725_test11;
OK

{"bbb":"22","aaa":"11"}

案例2:

hive> select str_to_map('aaa:11&bbb:22', '&', ':')['aaa']
    > from tmp.tmp_jzl_20140725_test11;

OK
11

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值