lateral view json_tuple函数解析非结构化的json数据类型

一、lateral VIEW json_tuple函数使用

工作中遇到一个数据表的存储形式,如下:

id col1 col2
1234 {"part1" : "61", "total" : "623", "part2" : "560", "part3" : "1", "part4" : "1"} {"to_part2" : "0", "to_part4" : "0", "to_up" : "0", "to_part3" : "0", "to_part34" : "0"}
4567 {"part1" : "451", "total" : "89928", "part2" : "88653", "part3" : "789", "part4" : "35"} {"to_part2" : "54", "to_part4" : "6", "to_up" : "65", "to_part3" : "2", "to_part34" : "3"}
7890 {"part1" : "142", "total" : "351808", "part2" : "346778", "part3" : "4321", "part4" : "567"} {"to_part2" : "76", "to_part4" : "23", "to_up" : "65", "to_part3" : "14", "to_part34" : "53"}

 

其中col1,col2都是string类型,存放的是JSON格式的数据,JSON的key分别是: 

col_name key_list
col1 [part1, part2, part3, part4, total]
col2 [to_part2, to_part3, to_part4, to_part34, to_up]

 

使用lateral view json_tuple函数 从两列中分别选出part3,part4, to_part3,to_part4的key对应的数据值:

--使用lateral VIEW json_tuple函数解析数据
SELECT
    id,
    to_part3,
    to_part4,
    IF(part3=0,0.0, to_part3/part3) as ratio3,
    IF(part4=0,0.0, to_part4/part4) as ratio4
FROM
	{table_name}
lateral VIEW json_tuple(col1, 'part3', 'part4') json1 AS part3,part4 
lateral VIEW json_tuple(col2, 'to_part3', 'to_part4') json2 AS to_part3,to_part4
WHERE
	...

 

二、对比lateral view json_tuple 和  lateral view explode 函数的区别

之前的博文 explode和 lateral view explode函数解析非结构化的map数据类型 介绍了使用explode ,  lateral view explode 函数来解析Map类型数据的key, value的应用。

初看下这两个例子很像,那么为什么这里使用later view json_tuple 而不是使用later view explode函数呢?

如果使用later view explode函数能不能达成想要的效果呢?

这里的关键点就是数据结构了。

本文中的例子,col1,col2数据类型是JSON,key是固定的,每条数据都有相同的key,即使这个key对应的值是0,也会有记录。

而上文中的例子,业务场景不一样,col1 、 col2的key不是固定的,数据类型是MAP。

 

col1 col2
{24235:r2,98766:r3} {65432:r1,35689:r2,24577:r3}
{13245:r3} {34567:r1,87654:r3}

这是跟随实际应用场景而选择的数据存储类型。

比如本文中,场景类型有限,就是(part1, part2, part3, part4,to_part2, to_part3, to_part4, to_part34 )这几类,所以使用JSON的形式,穷举key来保存数据是合适的。

而前博文的场景就不同了。在电商业务中,广告触点类型非常的多(多到成百上千),而一个用户进入电商网站,实际接触到的广告触点类型却是很少的(几个到几十个),这时候如果还用JSON类型穷举所有广告触点的key,就会发现大量key的值是0,这是一个稀疏数据,这是很浪费空间的。所以,这种情况下一般采用MAP数据类型,只保留有实际意义的key和对应的值。

所以,使用later view explode函数能通过将每条数据拆分成key、value的形式来使用。

而如果使用later view json_tuple函数的话,如果在一条数据中没有指定想要的key,那么就会报错失败了。

 

 

 

你可能感兴趣的:(Hive,&,Hadoop,sql,lateral,view,json_tuple)