Desenvolvimento de big data - funções de data comumente usadas no Hive e rotina de sql de pergunta contínua de data

A frente é um resumo das funções de data comumente usadas, e a parte de trás é um problema SQL de data contínua e suas rotinas de solução.

1. Data e hora atuais

select current_timestamp
-- 2020-12-05 19:16:29.284 

2. Obtenha a data atual, que é 05-12-2020

SELECT current_date; 
## OR 
SELECT current_date(); 
-- 2020-12-05 

3. Obtenha o carimbo de data / hora no sistema unix

SELECT UNIX_TIMESTAMP();
-- 1524884881 

4. Atualmente 05-12-2020

select substr(current_timestamp, 0, 10);
-- current_timestamp 

5. A corrente é 05-12-2020

select date_sub(current_date, 1);
--2020-12-04 

6.yyyy-MM-dd HH: MM: ss data de interceptação

select to_date("2017-10-22 10:10:10");
-- 2017-10-22 
select date_format("2017-10-22" "yyyy-MM")
-- 2017-10 

7. A diferença em dias entre duas datas

select datediff("2017-10-22", "2017-10-12");
-- 10

select datediff("2017-10-22 10:10:10", "2017-10-12 23:10:10");

-- 10

select datediff("2017-10-22 01:10:10", "2017-10-12 23:10:10");

-- 10 

8. Interceptação de tempo

select from_unixtime(cast(substr("1504684212155", 0,10) as int)) dt;
-- 2017-09-06 15:50:12 

9. Data e hora até a data

语法: to_date (string timestamp)

select to_date(from_unixtime(UNIX_TIMESTAMP()));
-- 2018-04-28

select FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd 10:30:00');

-- 2018-04-28 10:30:00

select concat(date_sub(current_date,1),' 20:30:00');

-- 2018-04-27 20:30:00

-- hive version 1.2.0

select date_format(date_sub(current_date,1),'yyyy-MM-dd 20:30:00'); 

10. Data adicionada

Nota : Apenas dois formatos de data originais são suportados:yyyy-MM-dd yyyy-MM-dd HH:mm:ss

Caso contrário, você precisa date_formattransferir

date_add
next_day 

11. Perguntas adicionais

Há uma tabela de membros ativos. A dimensão da partição diária é o id do membro, que pode ser substituído por device_id. Pergunte como calcular o número de membros ativos por três dias consecutivos nos últimos sete dias dws.dws_member_start_day. A estrutura da tabela ( ) é a segue (dt é a partição e o formato de data é aaaa-MM-dd, Cada partição é única device_id):

device_id             string                                                                      
dt                    string                

Rotina de solução

1. Primeiro pense sobre a função de data datediff, date_sub / date_add que pode ser usada

2. Datas contínuas, problemas contínuos usarão uma função de classificação, mas o valor da função de classificação é um valor numérico. Ele deve ser mapeado para a continuidade da data para facilitar o agrupamento. Por exemplo, você pode mapear uma data para uma contínua número, ou um número para um número contínuo. Data, as duas operações são realizadas através da combinação anterior datedff e date_sub, o princípio é que a data e a data podem ser subtraídas para obter um inteiro contínuo, e o inteiro pode ser subtraído de uma determinada data para obter uma data contínua, onde date_sub pode ser Classificação reversa para obter datas consecutivas.

3. Este problema pode ser resolvido subtraindo-se datas de classificação consecutivas ou id de classificação e, em seguida, agrupando

1. Adicione uma coluna de números de sequência de classificação com base na tabela original

SELECT device_id,
       dt,
       row_number() over(PARTITION BY device_id
                         ORDER BY dt) ro
FROM dws.dws_member_start_day

2. Converta o número de série em datas consecutivas ou converta a data em números consecutivos e torne-se gid

-- 2.1 序号转为连续日期
SELECT device_id,
    dt,
    datediff(dt, date_add('2020-07-20', row_number() over(PARTITION BY device_id
        ORDER BY dt))) gid
FROM dws.dws_member_start_day 

-- 2.2 日期转为连续序号
SELECT device_id,
    dt,
    (datediff(dt, '2020-07-21') - row_number() over(PARTITION BY device_id
        ORDER BY dt)) gid
FROM dws.dws_member_start_day 

3. Filtragem de grupo

SELECT device_id,count(1)
FROM
    (SELECT device_id,
        dt,
        datediff(dt, date_add('2020-07-20', row_number() over(PARTITION BY device_id
            ORDER BY dt))) gid
        FROM dws.dws_member_start_day
        WHERE datediff(dt, CURRENT_DATE) BETWEEN -7 AND 7 ) tmp
GROUP BY device_id,
    gid
HAVING count(1) < 3  

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/hu_lichao/article/details/110730481
Recomendado
Clasificación