{"id":1692,"date":"2020-11-03T18:27:00","date_gmt":"2020-11-03T21:27:00","guid":{"rendered":"https:\/\/kondado.com.br\/blog\/wiki\/?p=1692"},"modified":"2026-04-08T17:49:06","modified_gmt":"2026-04-08T20:49:06","slug":"adicionando-o-s3-como-destino-na-plataforma-da-kondado","status":"publish","type":"post","link":"https:\/\/kondado.com.br\/blog\/wiki\/2020\/11\/03\/adicionando-o-s3-como-destino-na-plataforma-da-kondado\/","title":{"rendered":"S3"},"content":{"rendered":"\n<p>O nosso destino do S3 (Simple Storage Service) da AWS permite que voc\u00ea crie um data lake de forma simples e barata seguindo o conceito de separar o armazenamento do processamento, comum em bancos de dados.<\/p>\n\n\n\n\n\n<p>Ao criar o S3 como destino na Kondado, voc\u00ea pode realizar ETL (ou ELT) de dados de mais de 70 fontes: <a href=\"https:\/\/kondado.com.br\/conectores.html\">https:\/\/kondado.com.br\/conectores.html<\/a> e utilizar tecnologias de virtualiza\u00e7\u00e3o como <a href=\"https:\/\/prestodb.io\/\">presto<\/a>, <a href=\"https:\/\/aws.amazon.com\/athena\/\">athena<\/a>, <a href=\"https:\/\/www.dremio.com\/\">dremio<\/a> e <a href=\"https:\/\/docs.aws.amazon.com\/redshift\/latest\/dg\/c-getting-started-using-spectrum.html\">Redshift Spectrum<\/a> para realizar consultas nos seus dados.<\/p>\n\n\n\n<p>Como no S3 h\u00e1 uma separa\u00e7\u00e3o entre processamento e armazenamento, os <a href=\"https:\/\/kondado.com.br\/blog\/wiki\/2020\/06\/26\/criando-modelos-na-plataforma-kondado\/\">nossos modelos<\/a> n\u00e3o se aplicam a este destino. Al\u00e9m disso, as opera\u00e7\u00f5es de agrega\u00e7\u00e3o de dados e desduplica\u00e7\u00e3o (UPSERT) devem ser feitas por voc\u00ea, seja na camada de virtualiza\u00e7\u00e3o ou com scripts como o <a href=\"https:\/\/towardsdatascience.com\/update-and-insert-upsert-data-from-aws-glue-698ac582e562\">AWS Glue<\/a>. Para ajud\u00e1-lo neste processo, n\u00f3s adicionamos neste destino a <a href=\"#url_notifications\">possibilidade de voc\u00ea enviar notifica\u00e7\u00f5es para URLs<\/a> que ir\u00e3o disparar estes processos.<\/p>\n\n\n\n<p>Abaixo n\u00f3s iremos explicar detalhadamente como funciona o nosso destino S3 e como adicion\u00e1-lo na Kondado.<\/p>\n\n\n\n<h3>1. Cria\u00e7\u00e3o da chave de acesso<\/h3>\n\n\n\n<p>O primeiro passo para adicionar o S3 como destino \u00e9 a cria\u00e7\u00e3o de uma chave de acesso na AWS para utiliza\u00e7\u00e3o da Kondado. Voc\u00ea pode acompanhar neste <a href=\"https:\/\/docs.aws.amazon.com\/IAM\/latest\/UserGuide\/id_credentials_access-keys.html\">tutorial da AWS como faz\u00ea-lo.<\/a><\/p>\n\n\n\n<p>A access key criada pode utilizar o exemplo de pol\u00edtica abaixo<\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\"><strong>Lembre-se de editar a vari\u00e1vel &#8220;CHANGE-THIS-WITH-BUCKET-NAME&#8221; com o nome do seu bucket de fato<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": &#091;\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": &#091;\n        \"s3:ListBucket\",\n        \"s3:GetObject\",\n        \"s3:PutObject\",\n        \"s3:DeleteObject\",\n        \"s3:CopyObject\",\n        \"s3:AbortMultipartUpload\",\n        \"s3:ListMultipartUploadParts\",\n        \"s3:GetBucketLocation\",\n        \"s3:ListBucketMultipartUploads\",\n        \"s3:DeleteObjectTagging\",\n        \"s3:ReplicateObject\",\n        \"s3:GetObjectAcl\",\n        \"s3:DeleteObjectVersion\",\n        \"s3:PutObjectTagging\",\n        \"s3:PutObjectAcl\"\n      ],\n      \"Resource\": &#091;\n        \"arn:aws:s3:::CHANGE-THIS-WITH-BUCKET-NAME\",\n        \"arn:aws:s3:::CHANGE-THIS-WITH-BUCKET-NAME\/*\"\n      ]\n    }\n  ]\n}\n<\/code><\/pre>\n\n\n\n<p>Al\u00e9m disso, voc\u00ea deve criar um <a href=\"https:\/\/docs.aws.amazon.com\/quickstarts\/latest\/s3backup\/step-1-create-bucket.html\">bucket onde os dados ser\u00e3o armazenados<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><p class=\"has-pale-cyan-blue-background-color has-background has-small-font-size\">Caso o seu bucket utilize criptografia com KMS, tamb\u00e9m \u00e9 necess\u00e1rio dar ao IAM permiss\u00e3o para acessar a KMS key (substitua REGION:ACCOUNT-ID e CHANGE-THIS-WITH-KMS-KEY-ID): <a rel=\"noreferrer noopener\" href=\"https:\/\/aws.amazon.com\/premiumsupport\/knowledge-center\/s3-bucket-access-default-encryption\/\" data-type=\"URL\" data-id=\"https:\/\/aws.amazon.com\/premiumsupport\/knowledge-center\/s3-bucket-access-default-encryption\/\" target=\"_blank\">Veja mais neste tutorial da AWS<\/a>\n<code>{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": &#091;\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": &#091;\n        \"kms:Encrypt\",\n        \"kms:Decrypt\",\n        \"kms:ReEncrypt*\",\n        \"kms:GenerateDataKey*\",\n        \"kms:DescribeKey\"\n      ],\n      \"Resource\": \"arn:aws:kms:REGION:ACCOUNT-ID:key\/CHANGE-THIS-WITH-KMS-KEY-ID\"\n    }\n  ]\n}<\/code><\/p><\/code><\/pre>\n\n\n\n<p>De posse da access key e do bucket, voc\u00ea j\u00e1 pode preencher as primeiras informa\u00e7\u00f5es <a href=\"https:\/\/kondado.com.br\/blog\/wiki\/adicionando-destinos-na-plataforma-da-kondado\/\" data-type=\"URL\" data-id=\"https:\/\/kondado.com.br\/blog\/wiki\/adicionando-destinos-na-plataforma-da-kondado\/\">de cria\u00e7\u00e3o do destino<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"548\" height=\"432\" src=\"https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2020\/11\/image.png\" alt=\"\" class=\"wp-image-1693\" srcset=\"https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2020\/11\/image.png 548w, https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2020\/11\/image-300x236.png 300w\" sizes=\"(max-width: 548px) 100vw, 548px\" \/><\/figure>\n\n\n\n<ul><li>Em <strong>Id da chave<\/strong> e <strong>Segredo da chave<\/strong>, preencha as informa\u00e7\u00f5es da chave gerada anteriormente<\/li><li>Em <strong>Bucket<\/strong> preencha apenas o nome do seu bucket j\u00e1 existente, sem nenhuma formata\u00e7\u00e3o de URL. Por exemplo &#8220;meu-bucket&#8221; est\u00e1 correto e &#8220;<s>s3:\/\/meu-bucket<\/s>&#8221; est\u00e1 errado. Lembre-se tamb\u00e9m de utilizar apenas o nome ra\u00edz do bucket, sem pastas filhas. Por exemplo, &#8220;<s>meu-bucket\/minha-pasta<\/s>&#8221; est\u00e1 errado &#8211; caso queira colocar uma pasta adiciona, fa\u00e7a isso ao preencher o <a href=\"#tabales-ou-pastas-ou-prefixos\" data-type=\"internal\" data-id=\"#tabales-ou-pastas-ou-prefixos\">nome da tabela<\/a> na integra\u00e7\u00e3o<\/li><\/ul>\n\n\n\n<h3>2. Formato do arquivo de sa\u00edda<\/h3>\n\n\n\n<p>Atualmente, enviamos arquivos nos seguintes formatos:<\/p>\n\n\n\n<h4>2.1 JSON (jsonl)<\/h4>\n\n\n\n<p>Este formato salva dados no formato JSON, um em cada linha do arquivo, com aspas escapadas por \\. Este \u00e9 um exemplo de um arquivo jsonl que ser\u00e1 enviado para o seu data lake:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>{\"\\\"keyword\\\"\":\"y\",\"\\\"url\\\"\":\"https:\\\/\\\/mailchi.mp\\\/a37895aff5ac\\\/subscribe_newsletter\",\"\\\"title\\\"\":\"https:\\\/\\\/mailchi.mp\\\/a37895aff5ac\\\/subscribe_newsletter\",\"\\\"timestamp\\\"\":1572559835000,\"\\\"clicks\\\"\":1}\n{\"\\\"keyword\\\"\":\"z\",\"\\\"url\\\"\":\"https:\\\/\\\/pipedrivewebforms.com\\\/form\\\/43fd725e54683d565a44ed4872c3560f4639452\",\"\\\"title\\\"\":\"Kondado - contato\",\"\\\"timestamp\\\"\":1572560617000,\"\\\"clicks\\\"\":2}<\/code><\/pre>\n\n\n\n<p>Caso voc\u00ea n\u00e3o aplique compress\u00e3o, os arquivos ser\u00e3o salvos com a extens\u00e3o &#8220;.json&#8221;<\/p>\n\n\n\n<h4>2.2 CSV<\/h4>\n\n\n\n<p>O formato CSV ir\u00e1 salvar arquivos neste formato tradicional e com extens\u00e3o &#8220;.csv&#8221; caso voc\u00ea n\u00e3o tenha fornecido nenhum m\u00e9todo de compress\u00e3o. Voc\u00ea precisar\u00e1 fornecer alguns par\u00e2metros adicionais de formata\u00e7\u00e3o do arquivo:<\/p>\n\n\n\n<p><strong>2.2.1 Delimitador de colunas<\/strong><\/p>\n\n\n\n<p>Os valores poss\u00edveis para o delimitador de colunas s\u00e3o<\/p>\n\n\n\n<ul><li>V\u00edrgula (&#8220;,&#8221;)<\/li><li>Pipe (&#8220;|&#8221;)<\/li><li>Tab (&#8220;\\t&#8221;)<\/li><\/ul>\n\n\n\n<p><strong>2.2.2 Quote<\/strong><\/p>\n\n\n\n<p>O par\u00e2metro quote indica como cada coluna em uma linha do arquivo ser\u00e1 envolta em aspas. As op\u00e7\u00f5es poss\u00edveis s\u00e3o um mapeamento 1 x 1 com o <a href=\"https:\/\/docs.python.org\/3\/library\/csv.html#csv.QUOTE_ALL\">m\u00f3dulo CSV<\/a> do python<\/p>\n\n\n\n<ul><li>All<\/li><li>Minimal<\/li><li>Non-numeric<\/li><li>None<\/li><\/ul>\n\n\n\n<p>Recomendamos o formato &#8220;All&#8221;.<\/p>\n\n\n\n<p>Como voc\u00ea deve ter percebido, quote e o delimitador de colunas podem entrar em conflito com o seu conte\u00fado caso estes caracteres tamb\u00e9m estejam presentes nos valores. Ent\u00e3o, todos os arquivos salvos possuem um caracter de escape padr\u00e3o para valores conflitantes, o backslash (&#8220;\\&#8221;).<\/p>\n\n\n\n<p><strong>2.2.3 Cabe\u00e7alho<\/strong><\/p>\n\n\n\n<p>Voc\u00ea tamb\u00e9m pode escolher se deseja que os arquivos enviados venham com cabe\u00e7alho ou n\u00e3o. Lembrando que, se voc\u00ea cadastrar uma URL de notifica\u00e7\u00f5es, o envio de cabe\u00e7alho torna-se desnecess\u00e1rio, pois n\u00f3s enviaremos para voc\u00ea o schema do objeto, com a ordem das colunas de acordo como foram escritas no arquivo. A ordem das colunas tamb\u00e9m obedecer\u00e1 a mesma ordem de exibi\u00e7\u00e3o da nossa UI quando voc\u00ea clica em &#8220;DETALHES&#8221; de uma dada integra\u00e7\u00e3o.<\/p>\n\n\n\n<h4>2.3 Parquet<\/h4>\n\n\n\n<p>Este formato salva dados no formato parquet.<\/p>\n\n\n\n<p>Caso voc\u00ea n\u00e3o aplique compress\u00e3o, os arquivos ser\u00e3o salvos com a extens\u00e3o &#8220;.parquet&#8221;<\/p>\n\n\n\n<h3>3. Compress\u00e3o<\/h3>\n\n\n\n<p>Voc\u00ea pode escolher aplicar um m\u00e9todo de compress\u00e3o aos seus arquivos ou n\u00e3o. Os m\u00e9todos de compress\u00e3o dispon\u00edveis ir\u00e3o alterar a extens\u00e3o dos arquivos salvos.<\/p>\n\n\n\n<h4>3.1 GZIP<\/h4>\n\n\n\n<p>Os arquivos comprimidos com o m\u00e9todo gzip ir\u00e3o receber a extens\u00e3o &#8220;.gz&#8221;<\/p>\n\n\n\n<h3 id=\"url_notifications\">4. URL de notifica\u00e7\u00e3o<\/h3>\n\n\n\n<p>Caso o par\u00e2metro &#8220;Notificar alguma URL&#8221; seja preenchido, voc\u00ea precisar\u00e1 informar uma URL v\u00e1lida em &#8220;URL para notifica\u00e7\u00f5es&#8221;. Esta URL deve estar habilitada para receber posts.<\/p>\n\n\n\n<h4>4.1 Quando ocorrer\u00e1 a notifica\u00e7\u00e3o na URL?<\/h4>\n\n\n\n<p>Ao fim de uma integra\u00e7\u00e3o, para cada objeto integrado e para cada opera\u00e7\u00e3o, n\u00f3s faremos um post na URL informada:<\/p>\n\n\n\n<ul><li>&#8220;para cada objeto&#8221; significa que integra\u00e7\u00f5es que populem mais de uma tabela far\u00e3o uma notifica\u00e7\u00e3o por tabela<\/li><li>&#8220;para cada opera\u00e7\u00e3o&#8221; significa que as opera\u00e7\u00f5es de envio para as tabelas full e para as tabelas de deltas (caso voc\u00ea tenha escolhido por manter deltas) far\u00e3o notifica\u00e7\u00f5es separadas<\/li><\/ul>\n\n\n\n<h4>4.2 E se a URL falhar?<\/h4>\n\n\n\n<p>Iremos considerar como sucesso uma notifica\u00e7\u00e3o para a URL informada que retorne um c\u00f3digo de resposta 200 em at\u00e9 30 segundos. Caso a resposta seja diferente disto ou demore mais, iremos realizar mais 3 tentativas e apontar um erro na integra\u00e7\u00e3o caso a falha persista. Entretanto, os arquivos nas pastas\/prefixos full e deltas n\u00e3o ser\u00e3o apagados<\/p>\n\n\n\n<h4>4.3 Payload enviado<\/h4>\n\n\n\n<p>Com os dados que ser\u00e3o enviados para a sua URL de notifica\u00e7\u00e3o, voc\u00ea ter\u00e1 todas as informa\u00e7\u00f5es necess\u00e1rias para disparar processos posteriores para manipula\u00e7\u00e3o dos arquivos enviados. Os campos padr\u00f5es do JSON de payload s\u00e3o os seguintes:<\/p>\n\n\n\n<p><strong>4.3.1 pipeline_id<\/strong><\/p>\n\n\n\n<p>Id da integra\u00e7\u00e3o que gerou os arquivos. O id de uma integra\u00e7\u00e3o pode ser obtido atrav\u00e9s da URL da integra\u00e7\u00e3o da Kondado no seu navegador: https:\/\/app.kondado.com.br\/pipelines\/<strong>id_da_integracao<\/strong><\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"pipeline_id\":231923<\/pre>\n\n\n\n<p><strong>4.3.2 bucket<\/strong><\/p>\n\n\n\n<p>Bucket onde os arquivos foram enviados. Corresponde ao bucket cadastrado por voc\u00ea nos par\u00e2metros do destino no momento em que a integra\u00e7\u00e3o salvou os arquivos<\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"bucket\":\"my-kdd-data-lake\"<\/pre>\n\n\n\n<p><strong>4.3.3 kdd_operation<\/strong><\/p>\n\n\n\n<p>Opera\u00e7\u00e3o que disparou a notifica\u00e7\u00e3o. Os valores poss\u00edveis s\u00e3o:<\/p>\n\n\n\n<ul><li><strong>merge_deltas<\/strong>: indica que esta opera\u00e7\u00e3o significa um envio de dados para a tabela de deltas<\/li><li><strong>merge_full<\/strong>: indica que esta opera\u00e7\u00e3o significa um envio de dados para a tabela full<\/li><\/ul>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"kdd_operation\":\"merge_deltas\"<\/pre>\n\n\n\n<p><strong>4.3.4 kdd_replication_type<\/strong><\/p>\n\n\n\n<p>O tipo de replica\u00e7\u00e3o desta integra\u00e7\u00e3o (integral\/incremental). Para integra\u00e7\u00f5es incrementais, voc\u00ea deve fazer &#8220;upsert&#8221; dos valores dos arquivos com o seu arquivo principal. Para integra\u00e7\u00f5es integrais, os novos arquivos enviados devem substituir o arquivo principal anterior.<\/p>\n\n\n\n<p>Os valores poss\u00edveis deste par\u00e2metro s\u00e3o:<\/p>\n\n\n\n<ul><li><strong>drop<\/strong>: indica que a integra\u00e7\u00e3o \u00e9 do tipo integral<\/li><li><strong>savepoint<\/strong>: indica que a integra\u00e7\u00e3o \u00e9 do tipo incremental<\/li><\/ul>\n\n\n\n<p>Este par\u00e2metro \u00e9 enviado apenas quando kdd_operation=merge_full.<\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"kdd_replication_type\":\"savepoint\"<\/pre>\n\n\n\n<p><strong>4.3.5 kdd_replication_keys<\/strong><\/p>\n\n\n\n<p>Caso a sua integra\u00e7\u00e3o seja incremental (kdd_replication_type=savepoint), ent\u00e3o este campo ir\u00e1 conter os campos (separados por v\u00edrgula) que voc\u00ea dever\u00e1 utilizar para fazer <strong>upsert<\/strong> com o arquivo principal.<\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"kdd_replication_keys\":\"lead_email,campaign_id\"<\/pre>\n\n\n\n<p><strong>4.3.6 schema<\/strong><\/p>\n\n\n\n<p>Array de jsons com os campos enviados para os arquivos, na ordem em que aparecem (\u00fatil para CSV e tamb\u00e9m para que o seu arquivo agregador principal tenha uma tipagem condizente com os seus dados).<\/p>\n\n\n\n<p>Neste array, cada json corresponder\u00e1 a um campo no arquivo de destino e conter\u00e1 as seguintes informa\u00e7\u00f5es:<\/p>\n\n\n\n<ul><li><strong>db_name<\/strong>: nome do campo no destino. Este \u00e9 o valor que voc\u00ea deve utilizar para criar o seu arquivo principal<\/li><li><strong>type<\/strong>: tipagem do campo, conforme normaliza\u00e7\u00e3o da Kondado. Os tipos de campos que s\u00e3o atualmente suportados por este destino s\u00e3o:<ul><li>text<\/li><li>timestamp<\/li><li>date<\/li><li>float<\/li><li>int<\/li><li>boolean<\/li><li>time<\/li><\/ul><\/li><li><strong>key<\/strong>: nome do campo conforme conector\/<a href=\"https:\/\/kondado.com.br\/blog\/blog\/2020\/06\/15\/metadados-na-kondado\/\">CMS da Kondado<\/a>. Para fins de agrega\u00e7\u00e3o dos arquivos em um arquivo principal, este campo pode ser ignorado, estamos enviando-o apenas para fins de esclarecimento<\/li><\/ul>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"schema\":[<br>       {<br>          \"db_name\":\"lead_id\",<br>          \"type\":\"text\",<br>          \"key\":\"id\"<br>       },<br>       {<br>          \"db_name\":\"etapa\",<br>          \"type\":\"text\",<br>          \"key\":\"Etapas__PerguntasRespostas-&gt;Etapa\"<br>       },<br>       {<br>          \"db_name\":\"pergunta\",<br>          \"type\":\"text\",<br>          \"key\":\"Etapas__PerguntasRespostas-&gt;Pergunta\"<br>       }<br>]<\/pre>\n\n\n\n<p><strong>4.3.7 files<\/strong><\/p>\n\n\n\n<p>Array com os nomes arquivos disponibilizados e a sua localiza\u00e7\u00e3o (prefixo). Por exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"files\":[\n      \"page_hits_deltas\/20201030220519913118.gz\",\n      \"page_hits_deltas\/20201030220533013600.gz\"\n   ]<\/pre>\n\n\n\n<p><strong>4.3.8 file_format<\/strong><\/p>\n\n\n\n<p>Formato do arquivo final criado. Lembre-se que, caso o arquivo sofra compress\u00e3o, o formato n\u00e3o corresponder\u00e1 \u00e0 sua extens\u00e3o, mas o arquivo &#8220;dentro&#8221; do arquivo comprimido estar\u00e1 neste formato. Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"file_format\":\"json\"<\/pre>\n\n\n\n<p><strong>4.3.9 file_format_params<\/strong><\/p>\n\n\n\n<p>Caso o formato de arquivo selecionado requeira par\u00e2metros adicionais de formata\u00e7\u00e3o (por exemplo, CSV) este campo ir\u00e1 trazer um JSON com os par\u00e2metros utilizados para criar o arquivo.<\/p>\n\n\n\n<p>Exemplo (CSV):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"file_format_params\":{\n    \"csv_delimiter\":\"pipe\",\n    \"csv_quote\":\"all\",\n    \"csv_include_header\":\"yes\"\n}<\/pre>\n\n\n\n<p><strong>4.3.10 file_compression<\/strong><\/p>\n\n\n\n<p>Este par\u00e2metro indica a compress\u00e3o aplicada ao arquivo de sa\u00edda. Caso nenhuma compress\u00e3o tenha sido aplicada, o seu valor ser\u00e1 &#8220;no&#8221;.<\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"file_compression\":\"gzip\"<\/pre>\n\n\n\n<p><strong>4.3.11 kdd_row_count<\/strong><\/p>\n\n\n\n<p>Este par\u00e2metro indica quantos registros\/linhas h\u00e1 no total nos arquivos enviados.<\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"kdd_row_count\":29173<\/pre>\n\n\n\n<h3 id=\"file_prefix\">5. Prefixo<\/h3>\n\n\n\n<p>Caso o par\u00e2metro &#8220;Incluir prefixo no nome do arquivo?&#8221; seja preenchido, voc\u00ea dever\u00e1 incluir um texto que ir\u00e1 ser inserido no in\u00edcio do nome do arquivo a ser enviado. Este texto pode conter caracteres de formata\u00e7\u00e3o que possam ajudar a particionar os arquivos em pastas no S3 (<a rel=\"noreferrer noopener\" href=\"https:\/\/docs.aws.amazon.com\/glue\/latest\/dg\/crawler-s3-folder-table-partition.html\" target=\"_blank\">exemplo<\/a>).<\/p>\n\n\n\n<p>O nome\/parte final do arquivo, sempre ser\u00e1 a timestamp em que foi executada a integra\u00e7\u00e3o + extens\u00e3o, neste formato: <strong>[YYYYMMDDhhmmssfffff] [.] [extens\u00e3o]<\/strong><\/p>\n\n\n\n<p>Al\u00e9m deste nome fixo, com este par\u00e2metro de prefixo, voc\u00ea pode adicionar vari\u00e1veis que ajudar\u00e3o a organizar o seu bucket, s\u00e3o eles:<\/p>\n\n\n\n<ul><li><strong>[exec_year]<\/strong>: Ano (YYYY) da execu\u00e7\u00e3o da integra\u00e7\u00e3o<\/li><li><strong>[exec_month]<\/strong>: M\u00eas (MM) da execu\u00e7\u00e3o da integra\u00e7\u00e3o<\/li><li><strong>[exec_day]<\/strong>: Dia do m\u00eas (DD) da execu\u00e7\u00e3o da integra\u00e7\u00e3o<\/li><li><strong>[exec_hour]<\/strong>: Hora (hh 24) da execu\u00e7\u00e3o da integra\u00e7\u00e3o<\/li><li><strong>[exec_minute]: <\/strong>Minuto (mm) da execu\u00e7\u00e3o da integra\u00e7\u00e3o<\/li><li><strong>[exec_second]<\/strong>: Segundos (ss) da execu\u00e7\u00e3o da integra\u00e7\u00e3o<\/li><li><strong>[exec_millisec]<\/strong>: Milisegundos (fffffff) da execu\u00e7\u00e3o da integra\u00e7\u00e3o<\/li><\/ul>\n\n\n\n<p>Estas vari\u00e1veis podem ser combinadas com texto livres e ser\u00e3o concatenadas na frente do nome do arquivo durante a inser\u00e7\u00e3o no S3.<\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\"><strong>Aten\u00e7\u00e3o<\/strong>: \u00c9 necess\u00e1rio que sejam escritos os colchetes &#8211; ] e [<\/p>\n\n\n\n<p><strong>Exemplo<\/strong><\/p>\n\n\n\n<p>Considere que foi preenchido o seguinte prefixo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[exec_year]\/month=[exec_month]\/{day=[exec_day]}<strong>\/<\/strong><\/pre>\n\n\n\n<p>Sendo o nome final do arquivo este:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">20210922161050851020.json<\/pre>\n\n\n\n<p>Neste caso, o nome a ser escrito na tabela do destino ser\u00e1:<\/p>\n\n\n\n<pre id=\"block-a5b8b34d-dcbd-4f90-9db5-ee3ac3f18293\" class=\"wp-block-preformatted\"><strong>2021\/month=09\/{day=22}\/<\/strong>20210922161050851020.json<\/pre>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\">Perceba que foi utilizado uma barra &#8220;\/&#8221; no final do prefixo ([exec_year]\/month=[exec_month]\/{day=[exec_day]}<span style=\"text-decoration: underline\"><strong>\/<\/strong><\/span>) &#8211; caso essa barra n\u00e3o fosse inserida, o arquivo seria 2021\/month=09\/{day=2<strong><span style=\"text-decoration: underline\">2}2<\/span><\/strong>0210922161050851020.json, que pode n\u00e3o ser o que voc\u00ea deseja<\/p>\n\n\n\n<h3 id=\"date_format\">6. Formato de data<\/h3>\n\n\n\n<p>Para colunas do tipo <em>date<\/em> e <em>timestamp<\/em>, \u00e9 poss\u00edvel especificar o formato de datas:<\/p>\n\n\n\n<ul><li><strong>ISO<\/strong>: os valores ser\u00e3o escritos no formato <a rel=\"noreferrer noopener\" href=\"https:\/\/www.iso.org\/iso-8601-date-and-time-format.html\" target=\"_blank\">ISO 8601<\/a><\/li><li><strong>Epoch<\/strong>: Os valores ser\u00e3o escritos no formato unix epoch time, em <span style=\"text-decoration: underline\">segundos<\/span><\/li><\/ul>\n\n\n\n<h3>Quest\u00f5es gerais<\/h3>\n\n\n\n<h4 id=\"tabales-ou-pastas-ou-prefixos\">Tabelas ou pastas ou prefixos?<\/h4>\n\n\n\n<p>Quando enviamos para outros bancos de dados, chamamos os &#8220;conjuntos&#8221; de registros de tabelas. No caso do S3, a forma de reunir os registros que pertencem \u00e0 mesma categoria \u00e9 por prefixos (comumente chamados de &#8220;pastas&#8221;). Para manter a uniformidade com o restante de destinos que suportamos, continuaremos a chamar de tabelas estes conjuntos de registros. Desta forma, sempre que voc\u00ea ver &#8220;tabela&#8221; dentro da Kondado referindo-se ao destino S3, entenda como &#8220;prefixo&#8221; (ou &#8220;pasta&#8221;). Ent\u00e3o, ao dar o nome a uma &#8220;tabela full&#8221; voc\u00ea estar\u00e1 dizendo qual deve ser o prefixo (pasta) dos arquivos criados no modo &#8220;full&#8221;<\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\">Caso deseje, voc\u00ea pode utilizar &#8220;\/&#8221; nos nomes das tabelas para criar uma estrutura de subpastas<\/p>\n\n\n\n<p>As tabelas\/pastas s\u00e3o a parte &#8220;fixa&#8221; da inser\u00e7\u00e3o dos arquivos, quer dizer, os arquivos sempre ser\u00e3o enviados para o mesmo caminho bucket\/pasta. A cria\u00e7\u00e3o de &#8220;sub-pastas&#8221; com o par\u00e2metro de <a href=\"#file_prefix\">prefixo<\/a> premite maior dinamismo, sendo poss\u00edvel especificar pastas para anos, meses, dias, hor\u00e1rios, etc diferentes, que ser\u00e3o alterados conforme o momento de execu\u00e7\u00e3o da integra\u00e7\u00e3o.<\/p>\n\n\n\n<p>Com todas as vari\u00e1veis que influenciam o nome e caminho do arquivo, voc\u00ea pode se guiar pelo diagrama abaixo que representa seus componentes e onde podem ser configurados<\/p>\n\n\n\n<div class=\"wp-block-image is-style-default\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2021\/10\/S3-dest_-esquema-nome-do-arquivo-1-1024x525.png\" alt=\"\" class=\"wp-image-3642\" width=\"795\" height=\"407\" srcset=\"https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2021\/10\/S3-dest_-esquema-nome-do-arquivo-1-1024x525.png 1024w, https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2021\/10\/S3-dest_-esquema-nome-do-arquivo-1-300x154.png 300w, https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2021\/10\/S3-dest_-esquema-nome-do-arquivo-1-768x393.png 768w, https:\/\/kondado.com.br\/blog\/wiki\/wp-content\/uploads\/sites\/2\/2021\/10\/S3-dest_-esquema-nome-do-arquivo-1.png 1515w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/figure><\/div>\n\n\n\n<h4>Fluxo de cria\u00e7\u00e3o de arquivos de uma integra\u00e7\u00e3o<\/h4>\n\n\n\n<p>Ao olhar o seu bucket no S3, voc\u00ea ir\u00e1 se deparar com v\u00e1rias &#8220;pastas&#8221; que possuem uma nomenclatura similar a esta &#8220;kdd_xxxxxxx_staging&#8221;. Os arquivos com este prefixo est\u00e3o atualmente sendo integrados pela Kondado. Uma vez que a leitura de dados da fonte termine, estas pastas de &#8220;staging&#8221; ir\u00e3o conter todos os arquivos desta execu\u00e7\u00e3o. A Kondado, ent\u00e3o, ir\u00e1 realizar a c\u00f3pia destes arquivos para as tabelas full e deltas &#8211; ao fim desta c\u00f3pia, iremos disparar a notifica\u00e7\u00e3o para a URL cadastrada.<\/p>\n\n\n\n<p>Antes e depois de cada integra\u00e7\u00e3o, as tabelas de staging ser\u00e3o esvaziadas para receber novos arquivos. Ent\u00e3o, pedimos para que n\u00e3o apague estas tabelas de staging, pois a sua integra\u00e7\u00e3o poder\u00e1 falhar ou, pior, gerar dados incompletos.<\/p>\n\n\n\n<p>Na Kondado, quando um destino \u00e9 um banco de dados, nossa plataforma lida com toda a de-duplica\u00e7\u00e3o dos dados a cada atualiza\u00e7\u00e3o e chegada de dados novos. Entretanto no caso do S3, o este fluxo \u00e9 de responsabilidade do usu\u00e1rio utilizando os campos de replication_keys. Caso n\u00e3o utilize URL de notifica\u00e7\u00e3o, estes campos de replica\u00e7\u00e3o podem ser encontrados na documenta\u00e7\u00e3o do conector, ao acessar o gr\u00e1fico de relacionamento. Eles estar\u00e3o marcados com um c\u00edrculo ao lado do campo. Em raros casos, \u00e9 poss\u00edvel que dois arquivos semelhantes sejam enviados em uma mesma execu\u00e7\u00e3o, por isso o seu fluxo de de-duplica\u00e7\u00e3o deve conseguir lidar com isso ao verificar os novos arquivos para de-duplica\u00e7\u00e3o<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guia para configurar o Amazon S3 como destino na Kondado. Crie um data lake simples e barato com seus dados integrados.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[281],"tags":[4,354,355,304,353,7,6,351,356,352,350],"_links":{"self":[{"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/posts\/1692"}],"collection":[{"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/comments?post=1692"}],"version-history":[{"count":40,"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/posts\/1692\/revisions"}],"predecessor-version":[{"id":11138,"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/posts\/1692\/revisions\/11138"}],"wp:attachment":[{"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/media?parent=1692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/categories?post=1692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kondado.com.br\/blog\/wiki\/wp-json\/wp\/v2\/tags?post=1692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}