window.lintrk('track', { conversion_id: 13086145 }); Forum posts
top of page

Posts do fórum

marcelo.souza
01 de abr. de 2023
In Big Data
Embora não seja um termo que se ouça sempre nos corredores, se trata de algo bem mais simples do que sugere o nome. Role-Playing Dimension refere-se a uma dimensão que pode ser usada em modelo dimensional para representar diferentes perspectivas de uma mesma entidade ou conceito, como se fosse um papel que essa entidade ou conceito pode assumir. Por exemplo, em um modelo dimensional que representa as vendas de uma loja, podemos ter uma dimensão de TEMPO, que permite analisar as vendas por dia, semana, mês ou ano. Para compreender bem o conceito, é importante saber um pouco também sobre Surrogate Key, pois a essa constraint(chave primária) da tabela é o que fará a conexão entre uma tabela DIM_TEMPO e FATO e permitirá que seja obtida da tabela DIM_TEMPO dados, para alimentar um ou mais campos na tabela FATO. Para ilustrar e fixar bem o conceito, imagine que você deseja realizar uma análise do rastreamento de um produto, desde o dia do pedido até a data da venda e com isso construir uma linha do tempo para assim conseguir mensurar quanto tempo levou entre uma etapa e outra e identificar possíveis falhas no processo logístico de acordo com tempo gasto. Quando esse tipo análise é demandado, sempre será necessário usarmos as datas presentes na tabela de TEMPO através das Surrogate Keys, que farão parte da tabela fato. Em muitos casos, quando não se tem o entendimento do conceito de modelagem dimensional, não é incomum se criar mais de uma tabela para completar as lacunas, porém quando modelada corretamente a tabela, pode trazer muitas facilidades e mitigar dificuldades em projetos e análises mais complexas. Para evitar o uso desnecessário de tabelas adicionais e atender bem as granularidades, podemos tornar o processo muito mais eficiente e profissional, adotando esse conceito e modelando a tabela de forma correta com os campos considerando as possibilidades de filtros, no caso em tela, entender qual será a dinâmica das análises e verificar como as datas são importantes para análises do negócio e processo e assim mapear a granularidade desejada. Para finalizar esse breve artigo, vamos apresentar uma forma de como podemos criar uma tabela DIM_TEMPO. A dimensão de TEMPO, é uma dimensão que após ser criada, será atualizada com um registro novo a cada dia que passar do dia mais recente. Abaixo um padrão de tabela para DIM_TEMPO que contempla os conceitos de Surrogate Key, e carrega datas a partir de uma data estabelecida, atendendo também algumas granularidades possíveis a partir da mesma data, como trimestre, semestre, dia do ano, etc. Para alimentar uma tabela de tempo criada com os campos previstos, podemos como no exemplo a seguir, desenvolver uma query que roda no banco de dados, usando funções para extrair do mesmo as respectivas datas e com isso podemos inserir o resultado na tabela DIM_TEMPO. No exemplo abaixo, a query está sendo executada para extrair de um banco PostgreSQL as datas e as informações da mesma para alimentar os campos desejados. select to_char(datum, 'yyyymmdd')::int as sk_data, datum as data_completa, extract(year from datum) as nr_ano, extract(month from datum) as nr_mes, to_char(datum, 'TMmonth') as nm_mes, extract(day from datum) as nr_dia_mes, to_char(datum, 'TMday') as nm_dia_semana, extract(doy from datum) as nr_dia_ano, extract(week from datum) as nr_semana, to_char(datum, 'dd/mm/yyyy') as data_formatada, 'T' || to_char(datum, 'Q') as nm_trimestre, to_char(datum, 'yyyy/"T"Q') as nr_ano_trimestre, to_char(datum, 'yyyy/mm') as nr_ano_nr_mes, to_char(datum, 'iyyy/IW') as nr_ano_nr_semana , case when extract(isodow from datum) in (6, 7) then 'Fim de Semana' else 'Dia de Semana' end as flag_tipo_dia_semana, --feriados fixos case when to_char(datum, 'mmdd') in ('0101', '1225', '1115', '1102', '1012', '0907', '0611', '0501', '0421', '0410', '0225', '0224') then 'Feriado' else 'Não Feriado' end as flag_feriado_fixo, -- periodos importantes para o negócio case when to_char(datum, 'mmdd') between '0601' and '0831' then 'Temporada de Inverno' when to_char(datum, 'mmdd') between '1115' and '1225' then 'Temporada de Natal' when to_char(datum, 'mmdd') > '1225' or to_char(datum, 'mmdd') <= '0106' then 'Temporada de Verão' else 'Normal' end as periodo_negocio, (datum + (1 - extract(day from datum))::integer + '1 month'::interval)::date - '1 day'::interval as ultimo_dia_mes from ( -- data inicial da carga select '2017-01-01'::date + sequence.day as datum from generate_series(0,3652) as sequence(day) group by sequence.day ) dq order by 1; Resultado: Como opção, depois de inseridos os registros na tabela, podemos aplicar um UPDATE na tabela e promover uma “tradução dos termos”, do inglês para o português, caso seja mais conveniente para o projeto e usuários. Conclusão: A técnica de role-playing dimension é útil para modelar conceitos que possuem diferentes perspectivas e para permitir a análise de dados em diferentes níveis de granularidade. No entanto, é importante usar essa técnica com cuidado para não criar complexidade desnecessária no modelo dimensional, o que pode dificultar a análise e a manutenção do modelo. Esse breve artigo, buscou trazer uma visão do conceito de role-playing dimension, mas que ajudará a entender a importância de dominar bem os conceitos de modelagem multidimensional, granularidade e surrogate key, pois a importância de termos bem desenhados os requisitos, construir o modelo de forma eficiente para atender as expectativas será mais fácil. Os códigos apresentados nos prints acima estão disponíveis no link: 😀 did you understand? I hope so!😉
ROLE-PLAYING DIMENSION: o que é, de onde vêm, do que se alimenta? content media
0
0
144
marcelo.souza
31 de mar. de 2023
In Big Data
O registro do tempo é dado mais importante quando uma operação informatizada acontece e ou é executada por um sistema de informação, pois representa a memória do fato acontecido e permite olharmos para trás e enxergar quando algo relevante aconteceu. Quero apresentar os formatos mais comuns de representar o tempo em datasets/tabelas e como usar a linguagem de programação Pyspark para realizar algumas transformações necessárias para atender tais padrões para os projetos de análises de dados. 1. Como entendemos o TEMPO Se fizermos uma pergunta simples a qualquer pessoa, como por exemplo: “Que horas são agora?”; “A data de seu nascimento?”; “Qual o dia da festa?”; “Quanto tempo devo deixar uma receita no forno?”; Essas e outras diversas perguntas demandam uma resposta que envolvem alguma medida de tempo, em maior ou menor nível de detalhe; não é diferente quando é preciso responder perguntas de negócios em que o tempo é a informação que dará significado ou contexto a um fato ocorrido, porém, muitas vezes é necessário obter tal resposta a partir do tratamento de um registro que está em um formato não usual ou mesmo através de cálculos de dados recebidos. 2. Formatos mais comuns para Data/Hora. 2.1 IS0 8601 A ISO 8601 é uma norma internacional para representação de data e hora emitida pela Organização Internacional para Padronização (International Organization for Standardization, ISO). Especificamente esta norma define: “Elementos de dados e formatos de intercâmbio para representação e manipulação de datas e horas”. A principal característica do formato de data e hora da norma ISO 8601 é que a informação de data e hora seja ordenada a partir do valor mais significativo ou, em termos simples, do maior (o ano) para o menor (o segundo). 2.2 A Data / Hora em formato UNIX A hora UNIX é um relógio que marca a quantidade de segundos passados desde 1º de Janeiro de 1970 (UTC) até o momento atual. Foi criado com o objetivo de facilitar o cálculo de datas entre computadores, visto que o cálculo de datas feito através do formato ‘humano’ é difícil para um computador. Deixo como exercício e também para exploração, um site que ajuda no processo de conversão de formato ISSO para UNIX e vice-versa, a descoberta de qual data se refere o número: 1677447600. A sugestão de um site para converter e explorar: https://www.nexcess.net/web-tools/unix-timestamp-converter/ 2.3 A Date / Hora em formato de notação científica É provável que em algum momento trabalhando com arquivos Excel você já tenha se deparado com uma coluna com registro neste padrão: 1.29905E+12; isso acontece quando uma coluna do Excel recebe uma cadeia de números com mais de 11 dígitos, ou seja, acontece uma conversão automática para notação científica e são muito chatas, porém é mais comum do que se imagina, mas é possível tratar, como veremos mais a diante. 3. Conhecendo e convertendo o dado TEMPO: A seguir vamos simular como dados em formato string, comumente ingeridos de arquivos CSV e ou Excel, podem ser convertidos para obter uma tipagem/formato mais adequado aos padrões de projetos de BI e Big Data. Passo 1) Importar bibliotecas e funções fundamentais do sql para usar no spark. from pyspark.sql.functions import * from pyspark.sql.types import * from datetime import datetime from pyspark.sql import SparkSession Passo 2) Criar um dataframe com os dados de exemplos formatos a serem convertidos. # Create SparkSession spark = SparkSession.builder.appName('Lab_Tempo').getOrCreate() data = [( "2021-09-30 14:30:00", # iso_8601 "2021-09-30T14:30:00.000Z", # ano_mes_dia_hr_mm_ss_mmutc "1677447600", # formato_unix "01-Oct-2021 14:30:00", # abreviado 4.44357E+05, # notacao_cientifica "13/03/2023", # padrao_csv_excel_1 "13-03-2023", # padrao_csv_excel_2 "01/10/2021:14:30:00 -0300", # data_hora_utc_3 )] # Cria um dataframe a partir dos dados df = spark.createDataFrame(data, [ "iso_8601", "ano_mes_dia_hr_mm_ss_mmutc", "formato_unix", "abreviado", "notacao_cientifica", "padrao_csv_excel_1", "padrao_csv_excel_2", "data_hora_utc_3" ] ) Conversão 01: de formato UNIX para Timestamp: Exemplo citado no tópico 2.2: 1677447600: OBS: note que embora tenha sido descoberta a data/hora, o mesmo permanece como string, porém a conversão abaixo pode ser aplicada para transformar esse campo em timestamp de verdade. Conversão 02: para uma data/hora no formato isso_8601 a partir de uma string: Conversão 03: de data/hora com UTC: Conversão 04: data com mês abreviado: OBS: destaque para o formato original e o definido, MMM para o mês e também o padrão PT-Br, mas ao ser apresentado fica como yyyy-mm-dd. Conversão 05: notação número em notação científica em timestamp: Conversão 06: data no padrão dd/mm/aaaa & dd-mm-aaaa; padrão de escrita PT-Br: Conversão 07: Data/Hora com UTC + 3 horas: OBS: Verificar sempre o UTC, pois é preciso considerar ou desconsiderar as horas a mais ou a menos. 4. Separando informações de campos timestamp/date: 5. Conclusão Esse breve artigo, trouxe um exemplo de como usar as funções do sql no pyspark timestamp e date para que possamos converter os registros de data em formatos mais adequados para serem usados em projetos, todavia, existem muitas possibilidade de obter informações dos registros de data e hora, como o dia da semana; se é ou não dia útil, se é ou não feriado; enfim. Deixo como referência para mais detalhes sobre formatos de data e hora no link: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes Link para acessar scripts usados: 😎
Tempo: o dado mais importante de uma tabela. content media
1
0
159

marcelo.souza

Mais ações
bottom of page