Hive разделен на следующие три типа в соответствии с определяемыми пользователем категориями функций:
(1)UDF(User-Defined-Function)
Один вход и один выход
(2)UDAF(User-Defined Aggregation Function)
Функция агрегирования, несколько входов и один выход
Похоже на: количество/макс/мин
(3)UDTF(User-Defined Table-Generating Functions)
Один вошел, многие вышли
нравиться Боковой вид исследовать()
1. lateral view 、explode、reflect
1) Используйте функцию разнесения, чтобы разделить данные полей Map и Array в таблице куста.
нуждаться
Формат данных теперь следующий
zhangsan child1,child2,child3,child4 k1:v1,k2:v2
lisi child5,child6,child7,child8 k3:v3,k4:v4
Используйте \t для разделения полей. Все дочерние элементы будут разделены на один столбец.
+----------+--+
| mychild|
+----------+--+
| child1|
| child2|
| child3|
| child4|
| child5|
| child6|
| child7|
| child8|
+----------+--+
Также разделите ключ и значение карты, что приведет к следующему результату:
+----------------+-------------------+-- +
| mymapkey| mymapvalue |
+----------------+-------------------+-- +
| k1 | v1 |
| k2 | v2 |
| k3 | v3 |
| k4 | v4 |
+----------------+-------------------+-- +
выполнить
Создать базу данных улья
hive (demo)> CREATE table demo1(
name STRING,
children array <STRING>,
address Map <STRING,STRING>)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
stored as textFile;
Загрузить данные
Выполните следующую команду, чтобы создать файл данных таблицы.
#mkdir -p /export/servers/hivedatas/
#cd /export/servers/hivedatas/
#gedit maparray
zhangsan child1,child2,child3,child4 k1:v1,k2:v2
lisi child5,child6,child7,child8 k3:v3,k4:v4
hiveсреди столов Загрузить данные
hive (demo)> LOAD DATA LOCAL INPATH '/home/jerry/hive/demo1' INTO TABLE demo1;
Используйте разнесение, чтобы разделить данные в улье
Разделить данные в массиве
hive (demo)> SELECT explode(children) AS myChild FROM demo1;
mychild
child1
child2
child3
child4
child5
child6
child7
child8
Time taken: 1.187 seconds, Fetched: 8
row(s)
Разделить данные на карте
hive(demo)> SELECT explode(address) AS (myMapKey, myMapValue) FROM demo1;
mymapkey mymapvalue
k1 v1
k2 v2
k3 v3
k4 v4
Time taken: 0.117 seconds, Fetched: 4
row(s)
hive (demo)>
2) Используйте взрыв, чтобы разделить строку json.
нуждаться
Теперь существуют следующие форматы данных:
a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
Разделитель между полями |
Нам нужно проанализировать и получить значения, соответствующие всем месячным продажам, в виде следующего столбца (строка в столбец)
7fresh 4900 1900 9.9
jd 2090 78981 9.8
jdmart 6987 1600 9.0
выполнить
Создать таблицу улья
hive(demo)> CREATE TABLEdemo2(
area STRING,
goods_id STRING,
sale_info STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS textfile;
Подготовьте данныеи Загрузить данные
#cd /export/servers/hivedatas
#gedit explode_json
a:shandong,b:beijing,c:hebei|1,2,3,4,5,6,7,8,9|[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
Загрузить данныеприезжатьhiveсреди столов
hive(demo)> LOAD DATA LOCAL INPATH '/home/jerry/hive/demo2' OVERWRITE INTO TABLE demo2;
Разделить массив с помощью разнесения
hive(demo)> SELECT explode(split(goods_id,',')) as goods_id FROM demo2;
OK
goods_id
1
2
3
4
5
6
7
8
9
Time taken: 0.087 seconds, Fetched: 9
row(s)
Используйте взрыв, чтобы разобрать карту.
hive (demo)> SELECT explode(split(area,',')) as area FROM demo2;
OK
area
a:shandong
b:beijing
c:hebei
Time taken: 0.077 seconds, Fetched: 3
row(s)
Распаковать поля JSON
hive (demo)> SELECT explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')) as sale_info FROM demo2;
sale_info
"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"
"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"
"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"
Time taken: 0.082 seconds, Fetched: 3
row(s)
Затем используйте get_json_object, чтобы получить данные с ключевыми месяцами продаж.
hive (demo)> SELECT get_json_object(explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{')),'$.monthSales') as sale_info FROM demo2;
FAILED: SemanticException [Error 10081]:
UDTF's are not supported outside the SELECT clause, nor nested in expressions
Ошибка: SemanticException [ошибка 10081]: UDTF не поддерживаются вне предложения SELECT и не вложены в выражения.
UDTF (функция генерации таблиц (UDTF)) взорвать нельзя записать в другие функции
Если вы пишете так, вы хотите проверить два поля
SELECT explode(split(area,',')) as area,good_id FROM demo2;
Будет сообщено об ошибке FAILED: SemanticException 1:40 Только одно выражение в предложении SELECT поддерживается с помощью UDTF. Ошибка возле токена "good_id"
При использовании UDTF поддерживается только одно поле, поэтому должен появиться LATERAL VIEW.
3) Используйте с БОКОВЫМ ВИДОМ.
Запрос нескольких полей с видом сбоку
hive (demo)> SELECT goods_id2,sale_info FROM demo2 LATERAL VIEW explode(split(goods_id,',')) goods as goods_id2;
goods_id2 sale_info
1[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
2[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
3[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
4[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
5[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
6[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
7[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
8[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
9[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}]
Time taken: 0.075 seconds, Fetched: 9
row(s)
Среди них LATERAL VIEW взрыв(сплит(товар_ид,','))товары эквивалентны виртуальной таблице, которая связана с декартовым произведением исходной таблицы взрыв_латеральный_вид.
Также можно использовать несколько раз
hive (demo)> SELECT goods_id2,sale_info,area2 FROM demo2
LATERAL VIEW explode(split(goods_id,','))goods as goods_id2
LATERAL VIEW explode(split(area,',')) areaas area2;
goods_id2 sale_info area2
1[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}] a:shandong
1[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}] b:beijing
1[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}] c:hebei
9[{"source":"7fresh","monthSales":4900,"userCount":1900,"score":"9.9"},{"source":"jd","monthSales":2090,"userCount":78981,"score":"9.8"},{"source":"jdmart","monthSales":6987,"userCount":1600,"score":"9.0"}] c:hebei
Time taken: 0.052 seconds, Fetched: 27row(s)
hive (demo)> SELECT
get_json_object(concat('{',sale_info_1,'}'),'$.source') as source,
get_json_object(concat('{',sale_info_1,'}'),'$.monthSales')
as monthSales,
get_json_object(concat('{',sale_info_1,'}'),'$.userCount')
as monthSales,
get_json_object(concat('{',sale_info_1,'}'),'$.score')
as monthSales
FROM demo2
LATERAL VIEW
explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{'))sale_info
as sale_info_1;
OK
source monthsales monthsales monthsales
7fresh 4900 1900 9.9
jd 2090 78981 9.8
jdmart 6987 1600 9.0
Time taken: 0.05 seconds, Fetched: 3 row(s)
Наконец, мы можем полностью преобразовать эту строку данных в формате json в двумерную таблицу с помощью следующего предложения.
hive (hive_explode)> SELECT get_json_object(concat('{',sale_info_1,'}'),'$.source') as source,
get_json_object(concat('{',sale_info_1,'}'),'$.monthSales') as monthSales,
get_json_object(concat('{',sale_info_1,'}'),'$.userCount') as monthSales,
get_json_object(concat('{',sale_info_1,'}'),'$.score') as monthSales
FROM demo2
LATERAL VIEW explode(split(regexp_replace(regexp_replace(sale_info,'\\[\\{',''),'}]',''),'},\\{'))sale_info as sale_info_1;
OK
source monthsales monthsales monthsales
7fresh 4900 1900 9.9
jd 2090 78981 9.8
jdmart 6987 1600 9.0
Time taken: 0.05 seconds, Fetched: 3 row(s)
3) Строка в столбец
Описание связанного параметра
нуждаться
name | constellation | blood_type |
---|---|---|
Сунь Укун | Овен | A |
Лао Ван | Стрелец | A |
Песня Песня | Овен | B |
Чжу Бацзе | Овен | A |
Сестра Фэн | Стрелец | A |
Сгруппируйте людей одного знака зодиака и группы крови. Результат следующий:
Стрелец,A Лао Ван|Сестра Фэн
Овен,A Сунь Укун|Чжу Бацзе
Овен,B Песня Песня
Создайте локальный файл constellation.txt и импортируйте данные.
Выполните следующую команду, чтобы создать файл. Обратите внимание, что данные разделяются с помощью \t.
#cd /export/servers/hivedatas
#gedit demo3
Сунь Укун Овен A
Лао Ван Стрелец A
Песня Песня Овен B
Чжу Бацзе Овен A
Сестра Фэн Стрелец A
Создать таблицу ульяи Загрузить данные
hive (demo)> CREATE TABLE demo3(name STRING,constellation STRING,blood_type STRING)row format delimited fields terminated by ",";
Загрузить данныеhive (demo)> LOAD DATA LOCAL INPATH '/home/jerry/hive/demo3' INTO TABLE demo3;
в соответствии снуждаться Запросданные
hive (demo)> SELECT t1.base,concat_ws('|', collect_set(t1.name)) name FROM (SELECT
name,concat(constellation, "," , blood_type) base FROM demo3) t1
GROUP BY t1.base;
OK
t1.base name
Стрелец,A Лао Ван|Сестра Фэн
Овен,A Сунь Укун|Чжу Бацзе
Овен,B Песня Песня
Time taken: 2.179 seconds, Fetched: 3
row(s)
4) Перенос колонки
Требуемые функции:
LATERAL VIEW
использование:
hive> LATERAL VIEW udtf(expression) tableAlias AS columnAlias
Объяснение: используется с разделением, разнесением и другими UDTF. Он может разделить столбец данных на несколько строк данных. На этой основе разделенные данные можно агрегировать.
нуждаться
#cd /export/servers/hivedatas
#gedit movie.txt
«Отслеживание подозреваемых» саспенс, боевик, научная фантастика, драма
《Lie to me》 Саспенс, полиция и грабители, боевик, психология, драма
«Воин-Волк 2» война, действие, катастрофа
Используйте \t для разделения полей данных.
Разверните массив данных в категории фильмов. Результат следующий:
«Отслеживание подозреваемых» ожидание
«Отслеживание подозреваемых» действие
«Отслеживание подозреваемых» научная фантастика
«Отслеживание подозреваемых» сюжет
《Lie to me》 ожидание
《Lie to me》 Полицейские и грабители
《Lie to me》 действие
《Lie to me》 психология
《Lie to me》 сюжет
«Воин-Волк 2» война
«Воин-Волк 2» действие
«Воин-Волк 2» катастрофа
Создать таблицу данных
hive (demo)> create table movie_info(
movie STRING,
category array<STRING>)
row format delimited fields terminated by
"\t"
collection items terminated by
",";
Загрузить данные
hive (demo)> LOAD DATA LOCALINPATH"/home/jerry/hive/movie" INTO TABLE movie_info;
в соответствии снуждаться Запросданные
hive (demo)> SELECT movie,category_name
FROM movie_info lateral view explode(category) table_tmp as category_name;
movie category_name
«Отслеживание подозреваемых» ожидание
«Отслеживание подозреваемых» действие
«Отслеживание подозреваемых» научная фантастика
«Отслеживание подозреваемых» сюжет
《Lie to me》 ожидание
《Lie to me》 Полицейские и грабители
《Lie to me》 действие
《Lie to me》 психология
《Lie to me》 сюжет
«Воин-Волк 2» война
«Воин-Волк 2» действие
«Воин-Волк 2» катастрофа
Time taken: 0.05 seconds, Fetched: 12
row(s)
5) отражающая функция
отражающая функция может поддерживать вызов встроенной функции Java в SQL, уничтожая все udf-функции за секунды.
нуждаться1: Используйте Max в java.lang.Math, чтобы найти максимальное значение в двух столбцах.
Создать таблицу улья
hive (demo)> CREATE TABLE test_udf(col1 int,col2 int) row format delimited fields terminated by ',';
Подготовьте данныеи Загрузить данные
#cd /home/jerry/hive/
#gedit test_udf
1,2
4,3
6,4
7,5
5,6
Загрузить данные
hive (demo)> LOAD DATA LOCAL INPATH '/home/jerry/hive/test_udf' OVERWRITE INTO TABLE test_udf;
Выполнить запрос
hive (demo)> SELECT reflect("java.lang.Math","max",col1,col2) FROM test_udf;
_c0
2
4
6
7
6
Time taken: 0.075 seconds, Fetched: 5
row(s)
нуждаться2: Разные записи в файле выполняют разные встроенные функции Java.
выполнитьшаг:
Создать таблицу улья
hive (demo)> CREATE TABLE test_udf2(class_name STRING,method_name STRING,col1 int , col2 int) row format delimited fields terminated by ',';
Подготовьте данные
#cd /home/jerry/hive
#gedit test_udf2
java.lang.Math,min,1,2
java.lang.Math,max,2,3
Загрузить данные
hive (demo)> LOAD DATA LOCAL INPAT '/home/jerry/hive/test_udf2' OVERWRITE INTO TABLE test_udf2;
Выполнить запрос
hive (demo)> SELECT reflect(class_name,method_name,col1,col2) FROM test_udf2;
OK
_c0
1
3
Time taken: 0.072 seconds, Fetched: 2row(s)
2 оконные функции
1) Оконные функции SUM(), AVG(), MIN(), MAX()
Создать таблицу данныхзаявление
hive>CREATE table demo4 (
cookieid string,
creatrtime string, --day
pv int
) row format delimited
fields terminated by ',';
Подготовьте данные
cookie1,2024-04-10,1
cookie1,2024-04-11,5
cookie1,2024-04-12,7
cookie1,2024-04-13,3
cookie1,2024-04-14,2
cookie1,2024-04-15,4
cookie1,2024-04-16,4
Загрузить данные
hive>LOAD DATA LOCAL INPATH'/home/jerry/hive/demo4' into table demo4;
Включите умный локальный режим
hive>set hive.exec.mode.local.auto=true;
Совместное использование функции SUM() и оконной функции: результат связан с ORDER BY, а по умолчанию используется возрастающий порядок.
hive>SELECT
cookieid,createtime,pv,sum(pv) over(PARTITION BY cookieid ORDER BY createtime)
as pv1 FROM demo4;
OK
cookieid createtime pv pv1
cookie1 2024-04-10 1 1
cookie1 2024-04-11 5 6
cookie1 2024-04-12 7 13
cookie1 2024-04-13 3 16
cookie1 2024-04-14 2 18
cookie1 2024-04-15 4 22
cookie1 2024-04-16 4 26
Time taken: 1.444 seconds, Fetched: 7row(s)
pv1: накопленное pv в группе от начальной точки до текущей строки. Например, pv1 11-го числа = pv 10-го числа + pv 11-го числа, а 12-го = 10-го + 11-го + 12-го.
hive>SELECT cookieid,createtime,pv,
sum(pv) over(PARTITION BY cookieid ORDER BY
createtime ROWS BETWEEN unbounded preceding and current row) as pv2
FROM demo4;
OK
cookieid createtime pv pv2
cookie1 2024-04-10 1 1
cookie1 2024-04-11 5 6
cookie1 2024-04-12 7 13
cookie1 2024-04-13 3 16
cookie1 2024-04-14 2 18
cookie1 2024-04-15 4 22
cookie1 2024-04-16 4 26
Time taken: 3.307 seconds, Fetched: 7row(s)
пв2: тот же пв1
hive>SELECT
cookieid,createtime,pv,sum(pv) over(PARTITION BY cookieid) as pv3 FROM demo4;
OK
cookieid createtime pv pv3
cookie1 2024-04-16 4 26
cookie1 2024-04-15 4 26
cookie1 2024-04-14 2 26
cookie1 2024-04-13 3 26
cookie1 2024-04-12 7 26
cookie1 2024-04-11 5 26
cookie1 2024-04-10 1 26
Time taken: 1.333 seconds, Fetched: 7row(s)
pv3: собрать все pv в группе (cookie1).
hive>SELECT cookieid,createtime,pv,
sum(pv) over(PARTITION BY cookieid ORDER BY
createtime ROWS BETWEEN 3 preceding and current row) as pv4
FROM demo4;
OK
cookieid createtime pv pv4
cookie1 2024-04-10 1 1
cookie1 2024-04-11 5 6
cookie1 2024-04-12 7 13
cookie1 2024-04-13 3 16
cookie1 2024-04-14 2 17
cookie1 2024-04-15 4 16
cookie1 2024-04-16 4 13
Time taken: 1.409 seconds, Fetched: 7row(s)
pv4: текущая строка в группе + предыдущие 3 строки, например, 11-й день = 10-й день + 11-й день, 12-й день = 10-й день + 11-й день + 12-й день, 13-й день = 10-й день + 11-й день + 12-й день + 13-й день, 14-й = 11-й + 12-й + 13-й + 14-й
hive>SELECT cookieid,createtime,pv,
sum(pv) over(PARTITION BY cookieid ORDER BY
createtime ROWS BETWEEN 3 preceding and 1 following) as pv5
FROM demo4;
OK
cookieid createtime pv pv5
cookie1 2024-04-10 1 6
cookie1 2024-04-11 5 13
cookie1 2024-04-12 7 16
cookie1 2024-04-13 3 18
cookie1 2024-04-14 2 21
cookie1 2024-04-15 4 20
cookie1 2024-04-16 4 13
Time taken: 1.476 seconds, Fetched: 7row(s)
pv5: текущая строка в группе + 3 строки вперед + 1 строка позади, например, 14-й день = 11-й день + 12-й день + 13-й день + 14-й день + 15-й день = 5+7+3+2+4=21.
hive>SELECT cookieid,createtime,pv,
sum(pv) over(PARTITION BY cookieid ORDER BY
createtime ROWS BETWEEN current row and unbounded following) as pv6
FROM demo4;
cookieid createtime pv pv6
cookie1 2024-04-10 1 26
cookie1 2024-04-11 5 25
cookie1 2024-04-12 7 20
cookie1 2024-04-13 3 13
cookie1 2024-04-14 2 10
cookie1 2024-04-15 4 8
cookie1 2024-04-16 4 4
Time taken: 1.408 seconds, Fetched: 7
row(s)
pv6: текущая строка + все последующие строки в группе, например, 13-й день = 13-й день + 14-й день + 15-й день + 16-й день = 3+2+4+4=13, 14-й день = 14-й день + 15-й день + 16-й день =2+4+4=10.
иллюстрировать
Главное — понять значение ROWS BETWEEN, также называемого предложением окна:
AVG(), MIN(), MAX() и SUM() используются одинаково.
2) Оконные функции ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE()
Подготовьте данные
cookie1,2024-04-10,1
cookie1,2024-04-11,5
cookie1,2024-04-12,7
cookie1,2024-04-13,3
cookie1,2024-04-14,2
cookie1,2024-04-15,4
cookie1,2024-04-16,4
cookie2,2024-04-10,2
cookie2,2024-04-11,3
cookie2,2024-04-12,5
cookie2,2024-04-13,6
cookie2,2024-04-14,3
cookie2,2024-04-15,9
cookie2,2024-04-16,7
Создать таблицу данных
hive>CREATE TABLE demo5 (
cookieid STRING,
createtime STRING, --day
pv INT
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile;
Загрузить данные:
hive>LOAD DATA LOCAL INPATH '/home/jerry/hive/demo5' INTO TABLE demo5;
ROW_NUMBER()использовать
ROW_NUMBER() начинается с 1 и генерирует последовательность записей в группе по порядку.
hive>SELECT cookieid,createtime,pv,ROW_NUMBER() OVER(PARTITON BYcookieid ORDER BYpv desc) AS rn FROM demo5;
cookieid createtime pv rn
cookie1 2024-04-12 7 1
cookie1 2024-04-11 5 2
cookie1 2024-04-16 4 3
cookie1 2024-04-15 4 4
cookie1 2024-04-13 3 5
cookie1 2024-04-14 2 6
cookie1 2024-04-10 1 7
cookie2 2024-04-15 9 1
cookie2 2024-04-16 7 2
cookie2 2024-04-13 6 3
cookie2 2024-04-12 5 4
cookie2 2024-04-11 3 5
cookie2 2024-04-14 3 6
cookie2 2024-04-10 2 7
Time taken: 2.968 seconds, Fetched: 14row(s)
RANK() Используйте с DENSE_RANK()
RANK() генерирует рейтинг элементов данных в группе. Если рейтинги равны, в рейтинге останется вакансия.
DENSE_RANK() генерирует рейтинг элементов данных в группе. Если рейтинги равны, разрывов в рейтингах не будет.
hive>SELECT
cookieid,createtime,pv,RANK() OVER(PARTITON BYcookieid ORDER BYpv desc) AS
rn1,DENSE_RANK() OVER(PARTITON BYcookieid ORDER BYpv desc) AS rn2,ROW_NUMBER()
OVER(PARTITON BYcookieid ORDER BYpv DESC) AS rn3 FROM demo5 WHERE cookieid =
'cookie1';
OK
cookieid createtime pv rn1 rn2 rn3
cookie1 2024-04-12 7 1 1 1
cookie1 2024-04-11 5 2 2 2
cookie1 2024-04-16 4 3 3 3
cookie1 2024-04-15 4 3 3 4
cookie1 2024-04-13 3 5 4 5
cookie1 2024-04-14 2 6 5 6
cookie1 2024-04-10 1 7 6 7
Time taken: 3.388 seconds, Fetched: 7
row(s)
НТИЛЕ использование
Иногда возникает такая нуждаться: если данные отсортированы и разделены на три части.,Деловых людей волнует только часть этого,Как вынуть среднюю треть данных NTILEфункции достаточно?
NTILE можно рассматривать как равномерное распределение упорядоченного набора данных по заданному числу сегментов и присвоение номера сегмента каждой строке. Если его невозможно распределить равномерно, сначала будут выделены сегменты с меньшими номерами, а количество строк, которые можно поместить в каждый блок, будет отличаться не более чем на 1.
Затем вы можете выбрать первое или последнее n-е количество данных на основе номера сегмента. Данные будут отображаться полностью, и только соответствующие данные будут помечены конкретно, какую часть данных необходимо получить, и ее нужно вложить на один слой дальше и получить на основе меток.
hive>SELECT cookieid, hive>SELECT cookieid, createtime,pv,
NTILE(2) OVER(PARTITON BY cookieid ORDER BY
createtime) AS rn1,
NTILE(3) OVER(PARTITON BY cookieid ORDER BY
createtime) AS rn2,
NTILE(4) OVER(ORDER BY createtime) AS rn3
FROM demo5
ORDER BY cookieid,createtime;
OK
cookieid createtime pv rn1 rn2 rn3
cookie1 2024-04-10 1 1 1 1
cookie1 2024-04-11 5 1 1 1
cookie1 2024-04-12 7 1 1 2
cookie1 2024-04-13 3 1 2 2
cookie1 2024-04-14 2 2 2 3
cookie1 2024-04-15 4 2 3 4
cookie1 2024-04-16 4 2 3 4
cookie2 2024-04-10 2 1 1 1
cookie2 2024-04-11 3 1 1 1
cookie2 2024-04-12 5 1 1 2
cookie2 2024-04-13 6 1 2 2
cookie2 2024-04-14 3 2 2 3
cookie2 2024-04-15 9 2 3 3
cookie2 2024-04-16 7 2 3 4
Time taken: 3.825 seconds, Fetched: 14row(s)
использование LAG
LAG(col,n,DEFAULT) используется для подсчета значения n-й строки сверху в окне статистики. Первый параметр — это имя столбца, второй параметр — n-я строка сверху (необязательно, по умолчанию — 1). ), а третий параметр — значение по умолчанию (когда n-я строка равна NULL, берется значение по умолчанию, если не указано, оно равно NULL)
hive>SELECT cookieid,createtime,
ROW_NUMBER() OVER(PARTITON BYcookieid ORDER
BYcreatetime) AS rn,
LAG(createtime,1,'1970-01-01 00:00:00')
OVER(PARTITON BYcookieid ORDER BYcreatetime) AS last_1_time,
LAG(createtime,2) OVER(PARTITON BYcookieid
ORDER BYcreatetime) AS last_2_time
FROM demo5;
cookieid createtime rn last_1_time last_2_time
cookie1 2024-04-10 1 1970-01-0100:00:00 NULL
cookie1 2024-04-11 2 2024-04-10 NULL
cookie1 2024-04-12 3 2024-04-11 2024-04-10
cookie1 2024-04-13 4 2024-04-12 2024-04-11
cookie1 2024-04-14 5 2024-04-13 2024-04-12
cookie1 2024-04-15 6 2024-04-14 2024-04-13
cookie1 2024-04-16 7 2024-04-15 2024-04-14
cookie2 2024-04-10 1 1970-01-0100:00:00 NULL
cookie2 2024-04-11 2 2024-04-10 NULL
cookie2 2024-04-12 3 2024-04-11 2024-04-10
cookie2 2024-04-13 4 2024-04-12 2024-04-11
cookie2 2024-04-14 5 2024-04-13 2024-04-12
cookie2 2024-04-15 6 2024-04-14 2024-04-13
cookie2 2024-04-16 7 2024-04-15 2024-04-14
Time taken: 1.497 seconds, Fetched: 14row(s)
3) Функция окна: LAG(),LEAD(),FIRST_VALUE(),LAST_VALUE()
Last_1_time: указывает значение первой строки, значение по умолчанию — «1970-01-01 00:00:00».
Первая строка файла cookie1 и строка выше имеют значение NULL, поэтому значение по умолчанию — 1970-01-01 00:00:00.
Третья строка файла cookie1, значение на одну строку выше — это значение второй строки, 10 апреля 2015 г., 10:00:02.
Шестая строка файла cookie1, значение на одну строку выше — это значение пятой строки, 10 апреля 2015 г., 10:50:01.
Last_2_time: указывает значение второй строки выше и указывает значение по умолчанию.
Первая строка файла cookie1, следующие две строки имеют значение NULL.
Вторая строка файла cookie1, две верхние строки имеют значение NULL.
Четвертая строка файла cookie1, значение второй строки на 2 строки выше, 10 апреля 2015 г. 10:00:02
Седьмая строка cookie1, значение пятой строки на 2 строки выше, 10 апреля 2015 г. 10:50:0
LEAD
В отличие от LAG, LEAD(col,n,DEFAULT) используется для подсчета значения n-й строки снизу в окне статистики. Первый параметр — это имя столбца, а второй параметр — n-я строка снизу (. необязательно, по умолчанию — 1). Эти три параметра являются значениями по умолчанию (когда n-я строка вниз равна NULL, берется значение по умолчанию, если не указано, оно равно NULL)
hive>SELECT cookieid,createtime,
ROW_NUMBER() OVER(PARTITON BY cookieid ORDER BY createtime) AS rn,
LEAD(createtime,1,'1970-01-01 00:00:00')
OVER(PARTITON BY cookieid ORDER BY createtime) AS next_1_time,
LEAD(createtime,2) OVER(PARTITON BY
cookieid ORDER BY createtime) AS next_2_time
FROM demo5;
cookieid createtime rn next_1_time next_2_time
cookie1 2024-04-10 1 2024-04-11 2024-04-12
cookie1 2024-04-11 2 2024-04-12 2024-04-13
cookie1 2024-04-12 3 2024-04-13 2024-04-14
cookie1 2024-04-13 4 2024-04-14 2024-04-15
cookie1 2024-04-14 5 2024-04-15 2024-04-16
cookie1 2024-04-15 6 2024-04-16 NULL
cookie1 2024-04-16 7 1970-01-0100:00:00 NULL
cookie2 2024-04-10 1 2024-04-11 2024-04-12
cookie2 2024-04-11 2 2024-04-12 2024-04-13
cookie2 2024-04-12 3 2024-04-13 2024-04-14
cookie2 2024-04-13 4 2024-04-14 2024-04-15
cookie2 2024-04-14 5 2024-04-15 2024-04-16
cookie2 2024-04-15 6 2024-04-16 NULL
cookie2 2024-04-16 7 1970-01-0100:00:00 NULL
Time taken: 1.459 seconds, Fetched: 14row(s)
FIRST_VALUE
После сортировки внутри группы, заканчивающейся текущей строкой, первое значение
hive>SELECT cookieid,createtime,pv,
ROW_NUMBER() OVER(PARTITON BY cookieid
ORDER BY createtime) AS rn,
FIRST_VALUE(pv) OVER(PARTITON BY cookieid
ORDER BY createtime) AS first1
FROM demo5;
OK
cookieid createtime rn first1
cookie1 2024-04-10 1 1
cookie1 2024-04-11 2 1
cookie1 2024-04-12 3 1
cookie1 2024-04-13 4 1
cookie1 2024-04-14 5 1
cookie1 2024-04-15 6 1
cookie1 2024-04-16 7 1
cookie2 2024-04-10 1 2
cookie2 2024-04-11 2 2
cookie2 2024-04-12 3 2
cookie2 2024-04-13 4 2
cookie2 2024-04-14 5 2
cookie2 2024-04-15 6 2
cookie2 2024-04-16 7 2
Time taken: 1.407 seconds, Fetched: 14row(s)
LAST_VALUE
После сортировки внутри группы завершите ее на текущей строке и последнем значении.
hive>SELECT cookieid,createtime,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER
BY createtime) AS rn,
LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER
BY createtime) AS last1,
FIRST_VALUE(url) OVER(PARTITION BY cookieid
ORDER BY createtime DESC) AS last2
FROM demo5
ORDER BY cookieid,createtime;
OK
cookieid createtime rn last1 last2
cookie1 2024-04-10 1 1 4
cookie1 2024-04-11 2 5 4
cookie1 2024-04-12 3 7 4
cookie1 2024-04-13 4 3 4
cookie1 2024-04-14 5 2 4
cookie1 2024-04-15 6 4 4
cookie1 2024-04-16 7 4 4
cookie2 2024-04-10 1 2 7
cookie2 2024-04-11 2 3 7
cookie2 2024-04-12 3 5 7
cookie2 2024-04-13 4 6 7
cookie2 2024-04-14 5 3 7
cookie2 2024-04-15 6 9 7
cookie2 2024-04-16 7 7 7
Time taken: 3.947 seconds, Fetched: 14row(s)
Если вы хотите получить последнее значение после сортировки в группе, вам нужно обойти это:
hive>SELECT cookieid,createtime,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER
BY createtime) AS rn,
LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER
BY createtime) AS last1,
FIRST_VALUE(url) OVER(PARTITION BY cookieid
ORDER BY createtime DESC) AS last2
FROM demo5
ORDER BY cookieid,createtime;
особое вниманиеORDER BY
Если ORDER BY не указан, сортировка будет хаотичной и будут получены неправильные результаты.
hive>SELECT cookieid,createtime,
FIRST_VALUE(url) OVER(PARTITION BY
cookieid) AS first2
FROM demo5;
OK
cookieid createtime first2
cookie1 2024-04-10 1
cookie1 2024-04-16 1
cookie1 2024-04-15 1
cookie1 2024-04-14 1
cookie1 2024-04-13 1
cookie1 2024-04-12 1
cookie1 2024-04-11 1
cookie2 2024-04-16 7
cookie2 2024-04-15 7
cookie2 2024-04-14 7
cookie2 2024-04-13 7
cookie2 2024-04-12 7
cookie2 2024-04-11 7
cookie2 2024-04-10 7
Time taken: 1.405 seconds, Fetched: 14row(s)
4) Функция окна: CUME_DIST(), PERCENT_RANK()
Эти две функции анализа последовательности используются не очень часто. Примечание. Функция последовательности не поддерживает предложение WHERE.
Подготовка данных
d1,user1,1000
d1,user2,2000
d1,user3,3000
d2,user4,4000
d2,user5,5000
hive>CREATE EXTERNAL TABLE demo6(dept STRING,userid STRING,sal INT) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile;
Загрузить данные:
hive>LOAD DATA LOCAL INPATH '/home/jerry/hive/demo6' INTO TABLE demo6;
CUME_DIST
CUME_DIST связан с порядком сортировки ORDER BY.
CUME_DIST Количество строк, меньшее или равное текущему значению/Общее количество строк в группе ORDER Порядок по умолчанию Положительный порядок Восходящий порядок, например: подсчет количества людей с зарплатой меньше или равной текущему значению, как доля от общего числа людей.
hive>SELECT dept,userid,sal,
CUME_DIST() OVER(ORDER BY sal) AS rn1,
CUME_DIST() OVER(PARTITION BY dept ORDER BY sal) AS rn2
FROM
demo6;
OK
dept userid sal rn1 rn2
d1 user1 1000 0.2 0.3333333333333333
d1 user2 2000 0.4 0.6666666666666666
d1 user3 3000 0.6 1.0
d2 user4 4000 0.8 0.5
d2 user5 5000 1.0 1.0
Time taken: 2.571 seconds, Fetched: 5row(s)
r rn1: Раздела нет, все данные находятся в 1 группе, общее количество строк — 5.
Первая строка: количество строк меньше или равно 1000 равно 1, следовательно, 1/5 = 0,2.
Вторая строка: количество строк меньше или равно 2000 равно 2, следовательно, 2/5 = 0,4.
Третья строка: количество строк меньше или равное 3000 равно 3, следовательно, 3/5=0,6.
….
rn2: сгруппировано по отделам, количество строк в dpet=d1 равно 3,
Вторая строка: количество строк меньше или равно 1000 равно 1, следовательно, 1/3 = 0,33.
Вторая строка: количество строк меньше или равно 2000 равно 2, следовательно, 2/3 = 0,66.
…
5) Функция анализа: GROUPING SETS(), GROUPING__ID, CUBE,ROLLUP
Подготовка данных
2024-03,2024-03-10,cookie1
2024-03,2024-03-10,cookie5
2024-03,2024-03-12,cookie7
2024-04,2024-04-12,cookie3
2024-04,2024-04-13,cookie2
2024-04,2024-04-13,cookie4
2024-04,2024-04-16,cookie4
2024-03,2024-03-10,cookie2
2024-03,2024-03-10,cookie3
2024-04,2024-04-12,cookie5
2024-04,2024-04-13,cookie6
2024-04,2024-04-15,cookie3
2024-04,2024-04-15,cookie2
2024-04,2024-04-16,cookie1
Создать таблицу
hive>CREATE TABLE demo7 (
month STRING,
day STRING,
cookieid STRING
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile;
Загрузить данные:
hive>LOAD DATA LOCAL INPATH'/home/jerry/hive/demo7'
into table demo7;
GROUPING SETS
Наборы группировок — это удобный способ записи нескольких логик GROUP BY в одном операторе SQL.
Это эквивалентно UNION ALL наборов результатов GROUP BY разных размеров.
hive>SELECT month,day,
COUNT(DISTINCT cookieid) AS uv,
GROUPING_ID
FROM demo7
GROUP BY month,day
GROUPING SETS (month,day)
ORDER BY GROUPING_ID;
grouping_id указывает, к какому набору группировок принадлежит этот набор результатов.
В соответствии с условиями группировки месяца и дня в НАБОРАХ ГРУППЫ 1 представляет месяц, а 2 представляет день.
Эквивалентно
hive>SELECT month,NULL,COUNT(DISTINCT
cookieid) AS uv,1 AS GROUPING_ID
FROM demo7
GROUP BY month
UNION ALL
SELECT NULL as month,day,COUNT(DISTINCT
cookieid) AS uv,2 AS GROUPING_ID
FROM demo7
GROUP BY day;
hive>SELECT month,day,
COUNT(DISTINCT cookieid) AS uv,
GROUPING_ID
FROM demo7
GROUP BY month,day
GROUPING SETS (month,day,(month,day))
ORDER BY GROUPING_ID;
Эквивалентно
hive>SELECT month,NULL,COUNT(DISTINCT
cookieid) AS uv,1 AS GROUPING_ID FROM test_t5 GROUP BY month
UNION ALL
SELECT NULL,day,COUNT(DISTINCT cookieid) AS
uv,2 AS GROUPING_ID
FROM demo7 GROUP BY day
UNION ALL
SELECT month,day,COUNT(DISTINCT cookieid)
AS uv,3 AS GROUPING_ID
FROM demo7 GROUP BY month,day;
CUBE
Агрегирование на основе всех комбинаций измерений GROUP BY.
hive>SELECT month,day,
COUNT(DISTINCT cookieid) AS uv,
GROUPING_ID
FROM demo7
GROUP BY month,day
WITH CUBE
ORDER BY GROUPING_ID;
month day uv grouping__id
2024-03 2024-03-10 4 0
2024-04 2024-04-16 2 0
2024-04 2024-04-13 3 0
2024-04 2024-04-12 2 0
2024-04 2024-04-15 2 0
2024-03 2024-03-12 1 0
2024-03 NULL 5 1
2024-04 NULL 6 1
NULL 2024-04-16 2 2
NULL 2024-04-15 2 2
NULL 2024-04-13 3 2
NULL 2024-04-12 2 2
NULL 2024-03-12 1 2
NULL 2024-03-10 4 2
NULL NULL 7 3
Эквивалентно
hive>SELECT NULL,NULL,COUNT(DISTINCT
cookieid) AS uv,0 AS GROUPING_ID
FROM demo7
UNION ALL
SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING_ID
FROM demo7
GROUP BY month
UNION ALL
SELECT NULL,day,COUNT(DISTINCT cookieid) AS
uv,2 AS GROUPING_ID
FROM demo7 GROUP BY day
UNION ALL
SELECT month,day,COUNT(DISTINCT cookieid)
AS uv,3 AS GROUPING_ID
FROM demo7 GROUP BY month,day;
ROLLUP
Это подмножество CUBE, фокусирующееся на крайнем левом измерении и выполняющее иерархическую агрегацию из этого измерения.
Например, выполните иерархическое агрегирование, используя измерение месяца:
hive>SELECT month,day,
COUNT(DISTINCT cookieid) AS uv,
GROUPING_ID
FROM test_t5
GROUP BY month,day
WITH ROLLUP
ORDER BY GROUPING_ID;
month day uv grouping__id
2024-04 2024-04-16 2 0
2024-04 2024-04-15 2 0
2024-04 2024-04-13 3 0
2024-04 2024-04-12 2 0
2024-03 2024-03-12 1 0
2024-03 2024-03-10 4 0
2024-04 NULL 6 1
2024-03 NULL 5 1
NULL NULL 7 3
Time taken: 2.652 seconds, Fetched: 9
row(s)
Замените порядок месяца и дня и выполните иерархическое агрегирование, используя измерение дня:
hive>SELECT month,day,COUNT(DISTINCT
cookieid) AS uv,GROUPING__ID FROM demo7
GROUP BY month,day WITH ROLLUP ORDER
BYGROUPING__ID;
month day uv grouping__id
2024-04 2024-04-16 2 0
2024-04 2024-04-15 2 0
2024-04 2024-04-13 3 0
2024-04 2024-04-12 2 0
2024-03 2024-03-12 1 0
2024-03 2024-03-10 4 0
2024-04 NULL 6 1
2024-03 NULL 5 1
NULL NULL 7 3
Time taken: 2.652 seconds, Fetched: 9
row(s)
Эквивалентно
hive>SELECT day,month,
COUNT(DISTINCT cookieid) AS uv,
GROUPING_ID
FROM test_t5
GROUP BY day,month
WITH ROLLUP
ORDER BY GROUPING_ID;
Здесь агрегирование по дню и месяцу дает тот же результат, что и агрегирование по дню. Из-за отношений родитель-потомок, если это комбинация других измерений, он будет другим.
Если порядок месяца и дня обратный, иерархическое агрегирование будет выполняться с использованием измерения дня.