diff --git a/models/br_ibge_censo_2022/br_ibge_censo_2022__cadastro_enderecos.sql b/models/br_ibge_censo_2022/br_ibge_censo_2022__cadastro_enderecos.sql new file mode 100644 index 00000000..06f83ee0 --- /dev/null +++ b/models/br_ibge_censo_2022/br_ibge_censo_2022__cadastro_enderecos.sql @@ -0,0 +1,49 @@ +{{ + config( + alias="cadastro_enderecos", + schema="br_ibge_censo_2022", + partition_by={ + "field": "sigla_uf", + "data_type": "string", + }, + cluster_by=["id_municipio"], + ) +}} + +select + safe_cast(sigla_uf as string) sigla_uf, + safe_cast(cod_municipio as string) id_municipio, + safe_cast(cod_distrito as string) id_distrito, + safe_cast(cod_subdistrito as string) id_subdistrito, + safe_cast(cod_setor as string) id_setor_censitario, + safe_cast(cep as string) cep, + safe_cast(cod_unico_endereco as string) id_endereco, + safe_cast(num_quadra as string) numero_quadra, + safe_cast(num_face as string) numero_face, + safe_cast(dsc_localidade as string) localidade, + safe_cast(nom_tipo_seglogr as string) tipo_segmento_logradouro, + safe_cast(nom_titulo_seglogr as string) titulo_segmento_logradouro, + safe_cast(nom_seglogr as string) nome_logradouro, + safe_cast(num_endereco as string) numero_logradouro, + safe_cast(dsc_modificador as string) modificador_numero, + safe_cast(nom_comp_elem1 as string) complemento_elemento_1, + safe_cast(val_comp_elem1 as string) complemento_valor_1, + safe_cast(nom_comp_elem2 as string) complemento_elemento_2, + safe_cast(val_comp_elem2 as string) complemento_valor_2, + safe_cast(nom_comp_elem3 as string) complemento_elemento_3, + safe_cast(val_comp_elem3 as string) complemento_valor_3, + safe_cast(nom_comp_elem4 as string) complemento_elemento_4, + safe_cast(val_comp_elem4 as string) complemento_valor_4, + safe_cast(nom_comp_elem5 as string) complemento_elemento_5, + safe_cast(val_comp_elem5 as string) complemento_valor_5, + safe_cast(dsc_estabelecimento as string) descricao_estabelecimento, + safe_cast(cod_especie as string) tipo_especie, + safe_cast(cod_indicador_estab_endereco as string) tipo_estabelecimento, + safe_cast(cod_indicador_const_endereco as string) tipo_construcao, + safe_cast(cod_indicador_finalidade_const as string) tipo_finalidade_construcao, + safe_cast(cod_tipo_especi as string) tipo_edificacao_domicilio, + safe_cast(nv_geo_coord as string) nivel_geocodificacao_coordenadas, + safe_cast(latitude as string) latitude, + safe_cast(longitude as string) longitude, + st_geogpoint(safe_cast(longitude as float64), safe_cast(latitude as float64)) ponto +from `basedosdados-staging.br_ibge_censo_2022_staging.cadastro_enderecos` as t diff --git a/models/br_ibge_censo_2022/br_ibge_censo_2022__coordenada_endereco.sql b/models/br_ibge_censo_2022/br_ibge_censo_2022__coordenada_endereco.sql deleted file mode 100644 index 50f16f37..00000000 --- a/models/br_ibge_censo_2022/br_ibge_censo_2022__coordenada_endereco.sql +++ /dev/null @@ -1,18 +0,0 @@ -{{ - config( - alias="coordenada_endereco", - schema="br_ibge_censo_2022", - materialized="table", - cluster_by=["id_municipio", "id_uf", "especie_endereco"], - ) -}} - -select - safe_cast(id_uf as string) id_uf, - safe_cast(cod_mun as string) id_municipio, - safe_cast(cod_especie as string) especie_endereco, - safe_cast(nv_geo_coord as string) nivel_geo_coordenada, - safe_cast(latitude as float64) latitude, - safe_cast(longitude as float64) longitude, - st_geogpoint(safe_cast(longitude as float64), safe_cast(latitude as float64)) ponto -from `basedosdados-staging.br_ibge_censo_2022_staging.coordenada_endereco` as t diff --git a/models/br_ibge_censo_2022/br_ibge_censo_2022__dicionario.sql b/models/br_ibge_censo_2022/br_ibge_censo_2022__dicionario.sql index 740c13e9..cb72ed47 100644 --- a/models/br_ibge_censo_2022/br_ibge_censo_2022__dicionario.sql +++ b/models/br_ibge_censo_2022/br_ibge_censo_2022__dicionario.sql @@ -2,7 +2,7 @@ select safe_cast(id_tabela as string) id_tabela, safe_cast(nome_coluna as string) nome_coluna, - safe_cast(chave as string) chave, + safe_cast(trim(chave) as string) chave, safe_cast(cobertura_temporal as string) cobertura_temporal, safe_cast(valor as string) valor, from `basedosdados-staging.br_ibge_censo_2022_staging.dicionario` as t diff --git a/models/br_ibge_censo_2022/code/cnefe_2022_crawler.py b/models/br_ibge_censo_2022/code/cnefe_2022_crawler.py new file mode 100644 index 00000000..abb3aaca --- /dev/null +++ b/models/br_ibge_censo_2022/code/cnefe_2022_crawler.py @@ -0,0 +1,102 @@ +from constants import constants + +import os +import requests +import zipfile +import pandas as pd +from io import BytesIO +from tqdm import tqdm + + +CNEFE_FILE_NAMES = constants.CNEFE_FILE_NAMES.value +URL = constants.CNEFE_FTP_URL.value + + +# Função para baixar cada arquivo do FTP +def download_files_from_ftp(url: str) -> BytesIO: + """ + Baixa um arquivo do FTP e retorna seu conteúdo em memória. + + Parâmetros: + url (str): URL do arquivo a ser baixado. + + Retorna: + BytesIO: Conteúdo do arquivo baixado em memória. + """ + response = requests.get(url, stream=True) + response.raise_for_status() + total_size = int(response.headers.get('content-length', 0)) + block_size = 1024 # 1 Kibibyte + t = tqdm(total=total_size, unit='iB', unit_scale=True) + file_data = BytesIO() + for data in response.iter_content(block_size): + t.update(len(data)) + file_data.write(data) + t.close() + return file_data + +# Função para descompactar e processar o arquivo de São Paulo (SP) em chunks +def process_sp_file(file: BytesIO, uf:str) -> None: + """ + Descompacta, processa e salva o arquivo de São Paulo (SP) em chunks. + + Parâmetros: + file (BytesIO): Conteúdo do arquivo ZIP em memória. + """ + output_dir = f"/tmp/br_ibge_censo_2022/output/sigla_uf={uf}" + os.makedirs(output_dir, exist_ok=True) + chunk_number = 0 + + with zipfile.ZipFile(file) as z: + with z.open(z.namelist()[0]) as f: + for chunk in pd.read_csv(f, chunksize=1000000, sep=';', dtype=str): + chunk_number += 1 + chunk.to_parquet(os.path.join(output_dir, f"{uf}_chunk_{chunk_number}.parquet"), compression="gzip") + print(f"Chunk {chunk_number} de {uf} salvo com sucesso.") + +# Função para descompactar o arquivo na sessão +def unzip_file_in_session(file: BytesIO) -> pd.DataFrame: + """ + Descompacta um arquivo ZIP em memória e carrega seu conteúdo em um DataFrame do pandas. + + Parâmetros: + file (BytesIO): Conteúdo do arquivo ZIP em memória. + + Retorna: + pd.DataFrame: DataFrame com os dados do arquivo descompactado. + """ + with zipfile.ZipFile(file) as z: + with z.open(z.namelist()[0]) as f: + df = pd.read_csv(f,sep=';', dtype=str) + return df + +# Função para salvar o DataFrame em formato parquet com compressão gzip +def save_parquet(df: pd.DataFrame, mkdir: bool, table_id: str) -> None: + """ + Salva um DataFrame em formato parquet com compressão gzip em um diretório específico. + + Parâmetros: + df (pd.DataFrame): DataFrame a ser salvo. + mkdir (bool): Se True, cria o diretório se ele não existir. + table_id (str): Identificador da tabela usado para nomear o arquivo e diretório. + """ + output_dir = f"/tmp/br_ibge_censo_2022/output/sigla_uf={table_id}" + if mkdir: + os.makedirs(output_dir, exist_ok=True) + df.to_parquet(os.path.join(output_dir, f"{table_id}.parquet"), compression="gzip") + +# Baixar, descompactar e salvar os arquivos +for uf, filename in CNEFE_FILE_NAMES.items(): + url = f"{URL}/{filename}" + print(f'----- Baixando o arquivo: {url}') + + try: + zip_file = download_files_from_ftp(url) + if uf in ['SP', 'RJ', 'MG', 'BA', 'RS']: + process_sp_file(zip_file, uf) + else: + df = unzip_file_in_session(zip_file) + save_parquet(df, mkdir=True, table_id=uf) + print(f"Arquivo {filename} baixado e salvo com sucesso.") + except Exception as e: + print(f"Erro ao processar o arquivo {filename}: {e}") diff --git a/models/br_ibge_censo_2022/code/constants.py b/models/br_ibge_censo_2022/code/constants.py index f20c2fa4..39ff7696 100644 --- a/models/br_ibge_censo_2022/code/constants.py +++ b/models/br_ibge_censo_2022/code/constants.py @@ -1,6 +1,7 @@ from enum import Enum class constants(Enum): + URLS = {"populacao_grupos_idade":"https://apisidra.ibge.gov.br/values/t/1209/n3/all/v/allxp/p/all/c58/all", "populacao_residente": "https://apisidra.ibge.gov.br/values/t/9514/n6/all/v/allxp/p/all/c2/all/c287/allxt/c286/allxt", "indice_envelhecimento": "https://apisidra.ibge.gov.br/values/t/9515/n3/all/n6/all/v/all/p/all/d/v8845%202,v10612%202", @@ -16,4 +17,38 @@ class constants(Enum): "domicilios_pelo_menos_um_territorios_quilombolas": "https://apisidra.ibge.gov.br/values/t/9726/n145/all/v/7081,7082,7083,7084,7085/p/all/d/v7084%202,v7085%202", "populacao_residente_indigena_municipio": "https://apisidra.ibge.gov.br/values/t/9718/n6/all/v/93,350/p/all/c1714/allxt/c2661/allxt", "domicilios_moradores_indigenas_municipio": "https://apisidra.ibge.gov.br/values/t/9728/n6/all/v/381,382,5930,6554,8691/p/all/c2661/allxt/d/v5930%202,v6554%202", - "domicilios_pelo_menos_um_morador_indigenas_municipio": "https://apisidra.ibge.gov.br/values/t/9720/n6/all/v/5938,6554,7088,7089,7090/p/all/c2661/allxt/d/v5938%202,v6554%202" } + "domicilios_pelo_menos_um_morador_indigenas_municipio": "https://apisidra.ibge.gov.br/values/t/9720/n6/all/v/5938,6554,7088,7089,7090/p/all/c2661/allxt/d/v5938%202,v6554%202", + } + + #NOTE: CNEFE não será baixado do SIDRA + CNEFE_FTP_URL = 'http://ftp.ibge.gov.br/Cadastro_Nacional_de_Enderecos_para_Fins_Estatisticos/Censo_Demografico_2022/Arquivos_CNEFE/UF' + + CNEFE_FILE_NAMES = { + 'RO' : '11_RO.zip', + 'AC' : '12_AC.zip', + 'AM' : '13_AM.zip', + 'RR' : '14_RR.zip', + 'PA' : '15_PA.zip', + 'AP' : '16_AP.zip', + 'TO' : '17_TO.zip', + 'MA' : '21_MA.zip', + 'PI' : '22_PI.zip', + 'CE' : '23_CE.zip', + 'RN' : '24_RN.zip', + 'PB' : '25_PB.zip', + 'PE' : '26_PE.zip', + 'AL' : '27_AL.zip', + 'SE' : '28_SE.zip', + 'BA' : '29_BA.zip', + 'MG' : '31_MG.zip', + 'ES' : '32_ES.zip', + 'RJ' : '33_RJ.zip', + 'SP' : '35_SP.zip', + 'PR' : '41_PR.zip', + 'SC' : '42_SC.zip', + 'RS' : '43_RS.zip', + 'MS' : '50_MS.zip', + 'MT' : '51_MT.zip', + 'GO' : '52_GO.zip', + 'DF' : '53_DF.zip' + } diff --git a/models/br_ibge_censo_2022/schema.yml b/models/br_ibge_censo_2022/schema.yml index b1ceb526..0b3633a6 100644 --- a/models/br_ibge_censo_2022/schema.yml +++ b/models/br_ibge_censo_2022/schema.yml @@ -1300,3 +1300,102 @@ models: - name: taxa_alfabetizacao description: Taxa de alfabetização das pessoas indígenas de 15 anos ou mais de idade + - name: br_ibge_censo_2022__cadastro_enderecos + description: O Cadastro Nacional de Endereços para Fins Estatísticos - CNEFE é + uma base de dados de abrangência nacional criada em 2005. Esse cadastro contempla + endereços georreferenciados de domicílios e estabelecimentos de todo o país + para o ano de 2022. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [id_endereco, tipo_especie] + - custom_dictionary_coverage: + columns_covered_by_dictionary: + - nivel_geocodificacao_coordenadas + - tipo_especie + - tipo_estabelecimento + - tipo_construcao + - tipo_finalidade_construcao + - tipo_edificacao_domicilio + dictionary_model: ref('br_ibge_censo_2022__dicionario') + columns: + - name: sigla_uf + description: ID da Unidade da Federação + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - name: id_municipio + description: ID Município IBGE - 7 Dígitos + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__municipio') + field: id_municipio + - name: id_distrito + description: ID do Distrito + - name: id_subdistrito + description: ID do Subdistrito + - name: id_setor_censitario + description: ID do Setor Censitário + tests: [not_null] + - name: cep + description: CEP + tests: [not_null] + - name: id_endereco + description: Identificador do endereço + tests: [not_null] + - name: numero_quadra + description: Número da quadra + - name: numero_face + description: Número da face + - name: localidade + description: Localidade + - name: tipo_segmento_logradouro + description: Tipo do segmento do logradouro + - name: titulo_segmento_logradouro + description: Título do segmento do logradouro + - name: nome_logradouro + description: Nome do logradouro + - name: numero_logradouro + description: Número no logradouro + - name: modificador_numero + description: Modificador do número + - name: complemento_elemento_1 + description: 'Complemento: Elemento 1' + - name: complemento_valor_1 + description: 'Complemento: Valor 1' + - name: complemento_elemento_2 + description: 'Complemento: Elemento 2' + - name: complemento_valor_2 + description: 'Complemento: Valor 2' + - name: complemento_elemento_3 + description: 'Complemento: Elemento 3' + - name: complemento_valor_3 + description: 'Complemento: Valor 3' + - name: complemento_elemento_4 + description: 'Complemento: Elemento 4' + - name: complemento_valor_4 + description: 'Complemento: Valor 4' + - name: complemento_elemento_5 + description: 'Complemento: Elemento 5' + - name: complemento_valor_5 + description: 'Complemento: Valor 5' + - name: descricao_estabelecimento + description: Identificação do estabelecimento + - name: tipo_especie + description: Espécie de endereço + - name: tipo_estabelecimento + description: Tipo de estabelecimento + - name: tipo_construcao + description: Tipo de construção ou reforma + - name: tipo_finalidade_construcao + description: Tipo de finalidade de construção + - name: tipo_edificacao_domicilio + description: Tipo da edificação dos domicílios + - name: nivel_geocodificacao_coordenadas + description: Nível de geocodificação das coordenadas + - name: latitude + description: Latitude do Endereço + - name: longitude + description: Longitude do Endereço + - name: ponto + description: Ponto geográfico criado a partir das colunas longitude e latitude diff --git a/models/br_inep_saeb/br_inep_saeb__brasil_taxa_alfabetizacao.sql b/models/br_inep_saeb/br_inep_saeb__brasil_taxa_alfabetizacao.sql new file mode 100644 index 00000000..fa86f32b --- /dev/null +++ b/models/br_inep_saeb/br_inep_saeb__brasil_taxa_alfabetizacao.sql @@ -0,0 +1,15 @@ +{{ + config( + alias="brasil_taxa_alfabetizacao", + schema="br_inep_saeb", + materialized="table", + ) +}} + +select + safe_cast(ano as int64) ano, + safe_cast(rede as string) rede, + safe_cast(localizacao as string) localizacao, + safe_cast(area as string) area, + safe_cast(taxa_alfabetizacao as float64) taxa_alfabetizacao, +from `basedosdados-staging.br_inep_saeb_staging.brasil_taxa_alfabetizacao` as t diff --git a/models/br_inep_saeb/br_inep_saeb__uf_taxa_alfabetizacao.sql b/models/br_inep_saeb/br_inep_saeb__uf_taxa_alfabetizacao.sql new file mode 100644 index 00000000..e6c98376 --- /dev/null +++ b/models/br_inep_saeb/br_inep_saeb__uf_taxa_alfabetizacao.sql @@ -0,0 +1,13 @@ +{{ + config( + alias="uf_taxa_alfabetizacao", schema="br_inep_saeb", materialized="table" + ) +}} +select + safe_cast(ano as int64) ano, + safe_cast(sigla_uf as string) sigla_uf, + safe_cast(rede as string) rede, + safe_cast(localizacao as string) localizacao, + safe_cast(area as string) area, + safe_cast(taxa_alfabetizacao as float64) taxa_alfabetizacao, +from `basedosdados-staging.br_inep_saeb_staging.uf_taxa_alfabetizacao` as t diff --git a/models/br_inep_saeb/code/main.py b/models/br_inep_saeb/code/main.py new file mode 100644 index 00000000..f2b06cc4 --- /dev/null +++ b/models/br_inep_saeb/code/main.py @@ -0,0 +1,103 @@ +import pandas as pd +import basedosdados as bd +import os + +os.getcwd() + +INPUT = os.path.join(os.getcwd(), "input") +OUTPUT = os.path.join(os.getcwd(), "output") +URL = "https://download.inep.gov.br/saeb/resultados/saeb_2021_brasil_estados_municipios_c_tx_alfabetizado.xlsx" + +os.makedirs(INPUT, exist_ok=True) +os.makedirs(OUTPUT, exist_ok=True) + +os.system(f"cd {INPUT}; curl -O -k {URL}") + +# Brasil + +df_br = pd.read_excel(os.path.join(INPUT, os.path.basename(URL)), sheet_name="Brasil") + +df_br.columns + +df_br["ID"].unique() + +df_br["ANO_SAEB"].unique() + +df_br["DEPENDENCIA_ADM"].unique() + +df_br["LOCALIZACAO"].unique() + +df_br["CAPITAL"].unique() + +df_br["TX_ALFABETIZADO"].unique() + +df_br["DEPENDENCIA_ADM"] = df_br["DEPENDENCIA_ADM"].str.lower() + +df_br["LOCALIZACAO"] = df_br["LOCALIZACAO"].str.lower() + +df_br["CAPITAL"] = df_br["CAPITAL"].str.lower() + +df_br = df_br.drop(columns=["ID", "MEDIA_2_LP", "MEDIA_2_MT"]) + +df_br = df_br.rename( + columns={ + "ANO_SAEB": "ano", + "DEPENDENCIA_ADM": "rede", + "LOCALIZACAO": "localizacao", + "CAPITAL": "area", + "TX_ALFABETIZADO": "taxa_alfabetizacao", + }, + errors="raise", +) + +df_br.to_csv(os.path.join(OUTPUT, "brasil_taxa_alfabetizacao.csv"), index=False) + +# Estados + +df_ufs = pd.read_excel(os.path.join(INPUT, os.path.basename(URL)), sheet_name="Estados") + +df_ufs["DEPENDENCIA_ADM"] = df_ufs["DEPENDENCIA_ADM"].str.lower() + +df_ufs["LOCALIZACAO"] = df_ufs["LOCALIZACAO"].str.lower() + +df_ufs["CAPITAL"] = df_ufs["CAPITAL"].str.lower() + +bd_dirs_ufs = bd.read_sql( + "select sigla, nome from `basedosdados.br_bd_diretorios_brasil.uf`", + billing_project_id="basedosdados-dev", +) + +uf_map = dict([(i["nome"], i["sigla"]) for i in bd_dirs_ufs.to_dict("records")]) # type: ignore + +df_ufs["NO_UF"].unique() + +df_ufs["NO_UF"] = df_ufs["NO_UF"].replace(uf_map) + +df_ufs["NO_UF"].isna().sum() + +df_ufs = df_ufs.drop(columns=["CO_UF", "MEDIA_2_LP", "MEDIA_2_MT"]) + +df_ufs = df_ufs.rename( + columns={ + "ANO_SAEB": "ano", + "NO_UF": "sigla_uf", + "DEPENDENCIA_ADM": "rede", + "LOCALIZACAO": "localizacao", + "CAPITAL": "area", + "TX_ALFABETIZADO": "taxa_alfabetizacao", + }, + errors="raise", +) + +df_ufs.to_csv(os.path.join(OUTPUT, "uf_taxa_alfabetizacao.csv"), index=False) + +# Upload + +## Brasil + +tb_br = bd.Table(dataset_id="br_inep_saeb", table_id="brasil_taxa_alfabetizacao") +tb_br.create(os.path.join(OUTPUT, "brasil_taxa_alfabetizacao.csv")) + + +tb_uf = bd.Table(dataset_id="br_inep_saeb", table_id="uf_taxa_alfabetizacao") +tb_uf.create(os.path.join(OUTPUT, "uf_taxa_alfabetizacao.csv")) diff --git a/models/br_inep_saeb/schema.yml b/models/br_inep_saeb/schema.yml index 883b8dc4..ec20c3da 100644 --- a/models/br_inep_saeb/schema.yml +++ b/models/br_inep_saeb/schema.yml @@ -1492,6 +1492,57 @@ models: description: Percentual de alunos que se enquadram no nível nove de aprendizage - name: nivel_10 description: Percentual de alunos que se enquadram no nível dez de aprendizagem + - name: br_inep_saeb__brasil_taxa_alfabetizacao + description: Taxa de alfabetização para o Brasil referente ao 2º ano divulgado + pelo SAEB + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [ano, rede, localizacao, area] + - not_null_proportion_multiple_columns: + at_least: 0.95 + columns: + - name: ano + description: Ano + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: rede + description: Rede Escolar + - name: localizacao + description: Localização da escola + - name: area + description: 'Área onde a escola está localizada: interior, capital ou total' + - name: taxa_alfabetizacao + description: Taxa de alfabetização + - name: br_inep_saeb__uf_taxa_alfabetizacao + description: Taxa de alfabetização por UF referente ao 2º ano divulgado pelo SAEB + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: [ano, sigla_uf, rede, localizacao, area] + - not_null_proportion_multiple_columns: + at_least: 0.95 + columns: + - name: ano + description: Ano + tests: + - relationships: + to: ref('br_bd_diretorios_data_tempo__ano') + field: ano.ano + - name: sigla_uf + description: Sigla da Unidade da Federação + tests: + - relationships: + to: ref('br_bd_diretorios_brasil__uf') + field: sigla + - name: rede + description: Rede Escolar + - name: localizacao + description: Localização da escola + - name: area + description: 'Área onde a escola está localizada: interior, capital ou total' + - name: taxa_alfabetizacao + description: Taxa de alfabetização - name: br_inep_saeb__dicionario description: Dicionário para tradução dos códigos do conjunto br_inep_saeb. Para taduzir códigos compartilhados entre instituições, como id_municipio, buscar @@ -1504,7 +1555,7 @@ models: - chave - cobertura_temporal - not_null_proportion_multiple_columns: - at_least: 0.05 + at_least: 0.95 columns: - name: id_tabela description: ID Tabela diff --git a/models/br_me_siconfi/br_me_siconfi__municipio_despesas_funcao.sql b/models/br_me_siconfi/br_me_siconfi__municipio_despesas_funcao.sql index 8628a23d..490d9ea0 100644 --- a/models/br_me_siconfi/br_me_siconfi__municipio_despesas_funcao.sql +++ b/models/br_me_siconfi/br_me_siconfi__municipio_despesas_funcao.sql @@ -10,8 +10,7 @@ }, ) }} - -select +select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, safe_cast(id_municipio as string) id_municipio, diff --git a/models/br_me_siconfi/br_me_siconfi__municipio_despesas_orcamentarias.sql b/models/br_me_siconfi/br_me_siconfi__municipio_despesas_orcamentarias.sql index 8ec05906..49efbbba 100644 --- a/models/br_me_siconfi/br_me_siconfi__municipio_despesas_orcamentarias.sql +++ b/models/br_me_siconfi/br_me_siconfi__municipio_despesas_orcamentarias.sql @@ -10,8 +10,7 @@ }, ) }} - -select +select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, safe_cast(id_municipio as string) id_municipio, diff --git a/models/br_me_siconfi/br_me_siconfi__municipio_receitas_orcamentarias.sql b/models/br_me_siconfi/br_me_siconfi__municipio_receitas_orcamentarias.sql index c7091fa6..b0726929 100644 --- a/models/br_me_siconfi/br_me_siconfi__municipio_receitas_orcamentarias.sql +++ b/models/br_me_siconfi/br_me_siconfi__municipio_receitas_orcamentarias.sql @@ -10,8 +10,7 @@ }, ) }} - -select +select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, safe_cast(id_municipio as string) id_municipio, diff --git a/models/br_me_siconfi/br_me_siconfi__uf_despesas_funcao.sql b/models/br_me_siconfi/br_me_siconfi__uf_despesas_funcao.sql index a155f59c..b1032315 100644 --- a/models/br_me_siconfi/br_me_siconfi__uf_despesas_funcao.sql +++ b/models/br_me_siconfi/br_me_siconfi__uf_despesas_funcao.sql @@ -10,8 +10,7 @@ }, ) }} - -select +select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, safe_cast(id_uf as string) id_uf, diff --git a/models/br_me_siconfi/br_me_siconfi__uf_despesas_orcamentarias.sql b/models/br_me_siconfi/br_me_siconfi__uf_despesas_orcamentarias.sql index 9e0d3a1e..54560cdc 100644 --- a/models/br_me_siconfi/br_me_siconfi__uf_despesas_orcamentarias.sql +++ b/models/br_me_siconfi/br_me_siconfi__uf_despesas_orcamentarias.sql @@ -10,8 +10,7 @@ }, ) }} - -select +select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, safe_cast(id_uf as string) id_uf, diff --git a/models/br_me_siconfi/br_me_siconfi__uf_receitas_orcamentarias.sql b/models/br_me_siconfi/br_me_siconfi__uf_receitas_orcamentarias.sql index eeabd71c..f9be49b0 100644 --- a/models/br_me_siconfi/br_me_siconfi__uf_receitas_orcamentarias.sql +++ b/models/br_me_siconfi/br_me_siconfi__uf_receitas_orcamentarias.sql @@ -10,8 +10,7 @@ }, ) }} - -select +select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, safe_cast(id_uf as string) id_uf,