【Hadoop】常用命令整理

知识点一:
explode(split(get_json_object(fieldDataName,’$.str’),’,’))

1、fieldDataName表示数据库字段名;
2、$.str表示要从数据库定中JOSN类型的字段中取的内容

使用到的命令包括:
1、get_json_object :从JSON中取值;

get_json_object,多层JSON的取值
data =
{
"store":
    {
     "fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear"}],  
     "bicycle":{"price":19.95,"color":"red"}
     }, 
     "email":"amy@only_for_json_udf_test.net", 
      "owner":"amy" 
}

1.1、.get单层值
hive> select get_json_object(data, ‘$.owner’) from test;
结果:amy

1.2.get多层值.
hive> select get_json_object(data, ‘$.store.bicycle.price’) from test;
结果:19.95

1.3.get数组值[]
hive> select get_json_object(data, ‘$.store.fruit[0]’) from test;
结果:{“weight”:8,“type”:“apple”}

2、split:按,号分隔
split中使用多个分隔符的示例:

select split('张三|李四,王五|赵六',',|\\|')

多个分隔符使用“|”号进行连接。在上面的例子中,第一个分隔符是“,”,第二个分隔符是“\|”,因为本身多个分隔符就是使用|连接的,所以需要加\用来转义

3、explode:explode就是将hive一行中复杂的array或者map结构拆分成多行。explode可能经常会与Lateralview一起使用

4、Lateral view: 其实就是用来和像类似explode这种UDTF函数联用的。lateral view 会将UDTF生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行即每个game_id进行join 来达到连接UDTF外的select字段的目的。

示例:
select distinct course,student1 From courselog lateral view explode(split(get_json_object(data,’$.student’),’,’)) t as student1
where area=‘310000’ and log_date>=‘2018-11-01’ and student1<>’[]’

知识点二: HVIE中配合正则表达式的使用

例如:需要将[“张三”,“李四”]中学生名字取出来。

如果直接使用select explode(split('["张三","李四"]',',')),得出的结果就是:

[“张三”
“李四”]

这并不是我们希望得到的结果。希望的结果应该是不包括双引号,不包括中括号的。使用正则表达式对字符进行处理:

select explode(split(regexp_extract('["张三","李四"]','\\[(.+)\\]',1),','))

以上得到的结果就是去除[]的结果。

但是其实我们还是希望把双引号也去掉的。上面我们是希望把以下字符串([]")替换掉就可以了,发现可以使用以下命令来处理:

select regexp_replace('["张三","李四"]','"|\\[|\\]','')

这个得到的结果就是:张三,李四
到这一步再结合explode就可以达到效果了:

select explode(split(regexp_replace('["张三","李四"]','"|\\[|\\]',''),','))

这样得到的结果就是:

张三

李四

知识点三:关于HIVE里面进行时间戮和日期格式的转换:
from_unixtime(时间戮,日期格式),日期格式如果不指定,默认是’yyyy-MM-dd HH:mm:ss’

如果我们存储的时间戮格式是到毫秒的,需要将最后三位去掉,使用cast进行类型转换。

例如:from_unixtime(cast(t.time/1000 as int),‘yyyy-MM-dd’)

猜你喜欢

转载自blog.csdn.net/wx0628/article/details/86656534
今日推荐