Fala dataholics, aquela dica super rápida, não sei se você já se deparou com problemas de UTC no Databricks, mas, é mais comum do que imaginamos.
O cenário é o seguinte, tenho uma tabela com 5 registros e um campo de data do tipo timestamp (data e hora), todos os registros são do dia 25/02.
Para filtrar apenas pela data usarei um cast( as date) para remover a hora, conforme fica abaixo na primeira coluna.
Agora, aplicando o filtro no WHERE meus dados não aparecem? Que magia é essa? Onde estão meus dados? Estou ficando maluco? Quem nunca?
Confira comigo no replay, a tabela tem dados, mas aplicando o filtro no WHERE, nada retornou, não sei se algum ninja aí reparou na hora em que rodei o comando, eram exatamente as 21:15 da noite, horário de Brasília. Algo de errado não está certo e vamos descobrir.
A primeira vez que você ver isso, essa será sua reação, UAI tô ficando doido? rsrs
Estou rodando o comando current_date() no dia 25/02 as 21:18 da noite, horário de Brasília, mas, ele está me retornando o dia 26/02, mas que pegadinha do malandro é essa?
Calma! Temos uma explicação para isso, o Databricks trabalha com datas em UTC (Coordinated Universal Time), quer saber mais detalhes do que é UTC? Veja esse post do meu amigo Leandro Sampaio a explicação dele ficou muito massa:
Mas, em resumo, como estamos no Brasil, todos nossos relógios respeitam o fuso horário de Brasília, que claro difere de outros países, o fuso de Brasília em relação ao horário universal é -3 horas (menos 3 horas), o Databricks trabalha com o horário -0 horas.
Logo, quando são 21:00 no Brasil o horário UTC 0 já é 00:00 (meia-noite), veja este exemplo para clarear sua mente.
Comando executado no dia 25/02 as 20:29.
Note a hora retornada pelo current_timestamp na primeira coluna, ela está 3 horas a frente de São Paulo, por coincidência ainda é dia 25/02, então nossos dados estão retornando bonitinhos.
Agora vamos olhar o comando executado apos as 21:00.
Note que o current_date já está retornando dia 26/02, por isso nossos dados do dia 25/02 não são retornados na query usando o current_date.
Calma! Tem solução e já está no print, ela chama from_utc_timestamp(), com essa função podemos retornar o UTC correto nas nossas queries informando qual o timezone você deseja retorna, no exemplo eu informo o timezone 'America/Sao_Paulo'.
#Python
import pytz
from datetime import datetime
datetime.now(pytz.timezone('America/Sao_Paulo'))
--SQL
from_utc_timestamp(current_timestamp(),'America/Sao_Paulo')
Ah, Reginaldo, mas só ao nível de query? Calma!
Você também pode setar o timezone ao nível de sessão (Notebook), essa configuração também pode ser aplicada ao nível de cluster via spark configs (spark.sql.session.timeZone) e todos os nodes do cluster irão respeitar esse fuso horário.
Bom dataholics por hoje é isso, espero que te ajude.
Fiquem bem e até a próxima.
Comments