ETX、STX
STX (start of text),正文开始 ,ETX (end of text),正文结束
STX与ETX只是为了便于描述。其实STX用来描述16进制中的02这个字节,而ETX则是03
与ETX只是为了便于描述。其实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