Camada Gold - One Big table
Estrutura das Tabelas
O ambiente consiste em 6 tabelas principais que foram carregadas do armazenamento Delta na camada silver:
apolice
: Contém informações sobre as apólices de seguros.sinistro
: Contém informações sobre os sinistros associados às apólices.imovel
: Contém informações sobre os imóveis assegurados.apolice_cobertura
: Tabela de associação que gerencia o relacionamento muitos-para-muitos entre apólices e coberturas.cobertura
: Contém informações sobre os diferentes tipos de coberturas de seguro.avaliacao
: Contém avaliações dos imóveis.
Leitura dos Dados
Os dados são lidos do armazenamento Delta da camada silver e armazenados em DataFrames do PySpark.
from pyspark.sql.functions import year, month, sum, count, avg, format_string, date_format, coalesce, expr, lit
storageAccountName = "satcseguroimoveis"
apolice_df = spark.read.format('delta').load(f"/mnt/{storageAccountName}/silver/apolice")
sinistro_df = spark.read.format('delta').load(f"/mnt/{storageAccountName}/silver/sinistro")
imovel_df = spark.read.format('delta').load(f"/mnt/{storageAccountName}/silver/imovel")
apolice_cobertura_df = spark.read.format('delta').load(f"/mnt/{storageAccountName}/silver/apolice_cobertura")
cobertura_df = spark.read.format('delta').load(f"/mnt/{storageAccountName}/silver/cobertura")
avaliacao_df = spark.read.format('delta').load(f"/mnt/{storageAccountName}/silver/avaliacao")
Escrita dos Dados
Os DataFrames são então escritos em tabelas Delta para utilização futura.
apolice_df.write.format('delta').mode('overwrite').saveAsTable("APOLICE")
sinistro_df.write.format('delta').mode('overwrite').saveAsTable("SINISTRO")
imovel_df.write.format('delta').mode('overwrite').saveAsTable("IMOVEL")
apolice_cobertura_df.write.format('delta').mode('overwrite').saveAsTable("APOLICE_COBERTURA")
cobertura_df.write.format('delta').mode('overwrite').saveAsTable("COBERTURA")
avaliacao_df.write.format('delta').mode('overwrite').saveAsTable("AVALIACAO")
Criação da Tabela OBT (Operational Business Table)
A tabela OBT é criada para consolidar as informações agregadas e gerar insights de negócios.
CREATE OR REPLACE TABLE satcseguroimoveis_obt (
ANO INT,
MES STRING,
TOTAL_DE_VALOR_DE_SINISTRO DECIMAL(38,2) NOT NULL,
VALOR_TOTAL_DAS_APOLICES DECIMAL(38,2) NOT NULL,
TOTAL_DE_ATIVOS DECIMAL(38,2) NOT NULL,
TOTAL_DE_PASSIVOS DECIMAL(38,2) NOT NULL,
NUMERO_TOTAL_DE_IMOVEIS INT NOT NULL,
APOLICES_FINALIZADAS INT NOT NULL,
NUMERO_DE_SINISTROS INT NOT NULL,
NUMERO_DE_APOLICES_VENDIDAS INT NOT NULL,
VALOR_MEDIO_DE_PREMIO DECIMAL(38,6) NOT NULL
)
USING DELTA;
Inserção de Dados na Tabela OBT
Os dados são inseridos na tabela OBT a partir das tabelas silver, utilizando agregações e junções para consolidar a informação.
INSERT INTO satcseguroimoveis_obt
SELECT
YEAR(A.DATA_INICIO) AS ANO,
DATE_FORMAT(A.DATA_INICIO, 'MMMM') AS MES,
COALESCE(SUM(S.VALOR_SINISTRO), 0) AS TOTAL_DE_VALOR_DE_SINISTRO,
COALESCE(SUM(A.VALOR_APOLICE), 0) AS VALOR_TOTAL_DAS_APOLICES,
COALESCE(SUM(C.VALOR), 0) AS TOTAL_DE_ATIVOS,
COALESCE(SUM(I.VALOR_IMOVEL), 0) AS TOTAL_DE_PASSIVOS,
COALESCE(COUNT(AV.CODIGO_IMOVEL), 0) AS NUMERO_TOTAL_DE_IMOVEIS,
COALESCE(SUM(CASE WHEN A.DATA_TERMINO <= CURRENT_DATE THEN 1 ELSE 0 END), 0) AS APOLICES_FINALIZADAS,
COALESCE(COUNT(DISTINCT S.CODIGO_SINISTRO), 0) AS NUMERO_DE_SINISTROS,
COALESCE(COUNT(DISTINCT A.CODIGO_APOLICE), 0) AS NUMERO_DE_APOLICES_VENDIDAS,
COALESCE(AVG(A.VALOR_APOLICE), 0) AS VALOR_MEDIO_DE_PREMIO
FROM
APOLICE A
LEFT JOIN
SINISTRO S ON A.CODIGO_APOLICE = S.CODIGO_APOLICE
LEFT JOIN
IMOVEL I ON A.CODIGO_IMOVEL = I.CODIGO_IMOVEL
LEFT JOIN
APOLICE_COBERTURA AC ON A.CODIGO_APOLICE = AC.CODIGO_APOLICE
LEFT JOIN
COBERTURA C ON AC.CODIGO_COBERTURA = C.CODIGO_COBERTURA
LEFT JOIN
AVALIACAO AV ON I.CODIGO_IMOVEL = AV.CODIGO_IMOVEL
GROUP BY
YEAR(A.DATA_INICIO), DATE_FORMAT(A.DATA_INICIO, 'MMMM');
Exibição dos Dados
Os dados da tabela OBT são exibidos para análise e tomada de decisões.
ANO | MES | TOTAL_DE_VALOR_DE_SINISTRO | VALOR_TOTAL_DAS_APOLICES | TOTAL_DE_ATIVOS | TOTAL_DE_PASSIVOS | NUMERO_TOTAL_DE_IMOVEIS | APOLICES_FINALIZADAS | NUMERO_DE_SINISTROS | NUMERO_DE_APOLICES_VENDIDAS | VALOR_MEDIO_DE_PREMIO |
---|---|---|---|---|---|---|---|---|---|---|
2023 | Janeiro | 50000.00 | 300000.00 | 120000.00 | 1000000.00 | 500 | 50 | 200 | 150 | 2000.000000 |
2023 | Fevereiro | 45000.00 | 280000.00 | 110000.00 | 950000.00 | 480 | 45 | 180 | 140 | 2000.000000 |
2023 | Março | 55000.00 | 310000.00 | 125000.00 | 1050000.00 | 510 | 55 | 220 | 160 | 1937.500000 |
2023 | Abril | 47000.00 | 290000.00 | 115000.00 | 970000.00 | 490 | 48 | 190 | 150 | 1933.333333 |
2023 | Maio | 53000.00 | 320000.00 | 130000.00 | 1080000.00 | 520 | 60 | 210 | 170 | 1882.352941 |
2023 | Junho | 48000.00 | 300000.00 | 120000.00 | 990000.00 | 500 | 50 | 200 | 150 | 2000.000000 |
2023 | Julho | 46000.00 | 275000.00 | 105000.00 | 920000.00 | 470 | 47 | 180 | 140 | 1964.285714 |
2023 | Agosto | 52000.00 | 310000.00 | 125000.00 | 1040000.00 | 510 | 55 | 220 | 160 | 1937.500000 |
2023 | Setembro | 49000.00 | 295000.00 | 115000.00 | 980000.00 | 495 | 49 | 190 | 150 | 1966.666667 |
2023 | Outubro | 53000.00 | 320000.00 | 130000.00 | 1070000.00 | 520 | 60 | 210 | 170 | 1882.352941 |