SQL | 备忘录

2020-12-11  本文已影响0人  cathy1997

常用函数

查询一个a对应多个b的情况

select
  a,
  collect_list(distinct(b)) as b
from
  table
group by
  a

查询出现次数最多的一些记录

SELECT keyword, count( * ) AS count
FROM article_keyword
GROUP BY keyword
ORDER BY count DESC
LIMIT 20

查询数据库里是否存在重复数据

SELECT count(*),column1,column2,...columnN 
FROM table1 
GROUP BY column1,column2,...columnN 
HAVING count(*) > 1

模糊查询

hive解析json数据

str = {"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}

select
get_json_object('str', '$.movie') as movie;
...

说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NUll,这个函数每次只能返回一个数据项。

select b.b_movie,b.b_rate,b.b_timeStamp,b.b_uid 
from json a lateral view 
json_tuple(a.data,'movie','rate','timeStamp','uid') b as b_movie,b_rate,b_timeStamp,b_uid

参数为一组键和json字符串,返回值的元组。该方法比get_json_object高效,因此可以在一次调用中输入多次键。

使用Hive的内置的explode函数,explode()接收一个 array或者map 类型的数据作为输入,然后将 array 或 map 里面的元素按照每行的形式输出。其可以配合 LATERAL VIEW 一起使用。

SELECT
    subview.actor,
    get_json_object(subview.actor, '$.score') as score,
    get_json_object(subview.actor, '$.name') as name
FROM
    a lateral view explode(split(regexp_replace(regexp_replace(actor, '\\[|\\]',''), '\\}\\,\\{', '\\}\\-\\{'), '\\-')) subview as actor

lateral view为侧视图,把某一行数据拆分成多行数据,加上lateral view可以将拆分的单个字段数据与原始表数据关联上。
注意:在使用lateral view的时候需要指定视图别名和生成的新列别名

写入hive表分区

# 往表里加parquet内容
alter table xxx
add if not exists partition (p_date={{ ds_nodash }})
location '/xxx/yyy/p_date={{ ds_nodash }}'"

随机抽取

DISTRIBUTE BY rand(0) --随机打散到不同的节点
sort by rand(0) --每个节点内随机
上一篇 下一篇

猜你喜欢

热点阅读