top of page
Foto do escritorReginaldo Silva

Databricks: Where date = current_date (Cade meus dados?) Cuidado com o UTC

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.




461 visualizações0 comentário

Comments


Post: Blog2 Post
bottom of page