{"id":13143,"date":"2022-02-04T10:55:14","date_gmt":"2022-02-04T10:55:14","guid":{"rendered":"https:\/\/beta.bluetab.net\/mi-experiencia-en-el-mundo-de-big-data-parte-2\/"},"modified":"2022-02-04T11:04:30","modified_gmt":"2022-02-04T11:04:30","slug":"mi-experiencia-en-el-mundo-de-big-data-parte-2","status":"publish","type":"post","link":"https:\/\/bluetab.co.uk\/en\/mi-experiencia-en-el-mundo-de-big-data-parte-2\/","title":{"rendered":"Mi experiencia en el mundo de Big Data &#8211; Parte II"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"13143\" class=\"elementor elementor-13143\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b2ad9fe elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b2ad9fe\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7eac278\" data-id=\"7eac278\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-45481b1 elementor-widget elementor-widget-heading\" data-id=\"45481b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Mi experiencia en el mundo de Big Data - Parte II<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7843b8f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7843b8f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-1a4ee60\" data-id=\"1a4ee60\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b7c4857 elementor-position-left elementor-vertical-align-middle elementor-widget elementor-widget-image-box\" data-id=\"b7c4857\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><a href=\"https:\/\/www.linkedin.com\/in\/dreyes85\/\" target=\"_blank\" tabindex=\"-1\"><img decoding=\"async\" width=\"150\" height=\"150\" data-src=\"https:\/\/www.bluetab.co.uk\/wp-content\/uploads\/2021\/10\/Emanuel-150x150.jpeg\" class=\"attachment-thumbnail size-thumbnail wp-image-12345 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/Emanuel-150x150.jpeg 150w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/Emanuel-300x300.jpeg 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/Emanuel-768x768.jpeg 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/Emanuel-75x75.jpeg 75w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/Emanuel.jpeg 800w\" data-sizes=\"(max-width: 150px) 100vw, 150px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 150px; --smush-placeholder-aspect-ratio: 150\/150;\" \/><\/a><\/figure><div class=\"elementor-image-box-content\"><h4 class=\"elementor-image-box-title\"><a href=\"https:\/\/www.linkedin.com\/in\/dreyes85\/\" target=\"_blank\">David Emmanuel Reyes N\u00fa\u00f1ez<\/a><\/h4><p class=\"elementor-image-box-description\">Senior Data Engineer<\/p><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-ed6cc51\" data-id=\"ed6cc51\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-173edbe elementor-share-buttons--view-icon elementor-share-buttons--skin-minimal elementor-share-buttons--shape-circle elementor-grid-0 elementor-share-buttons--color-official elementor-widget elementor-widget-share-buttons\" data-id=\"173edbe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"share-buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_twitter\" role=\"button\" tabindex=\"0\" aria-label=\"Share on twitter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-twitter\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_linkedin\" role=\"button\" tabindex=\"0\" aria-label=\"Share on linkedin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-linkedin\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-37382f0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"37382f0\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-narrow\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4a10ec3\" data-id=\"4a10ec3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cab8096 elementor-widget elementor-widget-theme-post-featured-image elementor-widget-image\" data-id=\"cab8096\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-post-featured-image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-1024x576.png\" class=\"attachment-large size-large wp-image-12352\" alt=\"\" srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-1024x576.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-300x169.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-768x432.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-1536x864.png 1536w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-2048x1152.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e35b9ec elementor-widget elementor-widget-text-editor\" data-id=\"e35b9ec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>En la entrega anterior (adjunto) creamos los scripts para enlistar y descargar archivos desde Google Drive hacia nuestro filesystem local.<\/p><p>En esta entrega continuaremos con el c\u00f3digo de la funci\u00f3n processDriveFiles.py y crearemos los scripts para hacer la carga de archivos hacia Google Cloud<\/p><p>La funcionalidad de este script es procesar los archivos listados en nuestro archivo parameters.csv, los cuales tengan el par\u00e1mero Status con valor 1, recordemos que esto le indica a nuestro programa si el archivo se descargar\u00e1 y procesar\u00e1 o no.<\/p><p>A continuaci\u00f3n, el c\u00f3digo b\u00e1sico de esta funci\u00f3n. Para nuestro ejemplo solo incluiremos archivos con extensi\u00f3n <strong>csv<\/strong> y separados por pipes <strong>\u201c|\u201d.<\/strong><\/p><p>En pasos anteriores ya descargamos nuestro archivo al servidor local, el paso siguiente ser\u00e1 ingestarlo en Big query y subir el archivo a nuestro proyecto de GCP.<\/p><p>El siguiente c\u00f3digo se encarga de validar el archivo e ingestarlo hacia nuestro destino definido.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c57f9fc elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"c57f9fc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>#Validamos que el tama&ntilde;o del archivo sea mayor a 0 para poder cargarlo al destino definido en el archivo de configuraci&oacute;n, en este caso nuestro destino es Google Cloud Storage y BigQuery, al cual le dimos el valor 1 en nuestro archivo.\r\nfile_size=os.stat(props[&#039;archivo_origen&#039;]).st_size\r\n\r\nif (int(file_size)&gt;0):\r\n   if(int(props[&#039;Destino&#039;])=1):        \r\n\r\n#Tenemos las variables siguientes, sus valores son devueltos por la funci&oacute;n upload_GCS_BQ:\r\n#exit_codeBQ  - Bandera para indicar si la ingesta fue exitosa o no.\r\n#registros    - Almacena el numero de registros del archivo.\r\n#Timestamp_date &ndash; La fecha en que se hace la ingesta.\r\n#strerror  - Si hay error en la ingesta, esta variable almacena el #c&oacute;digo del error\r\n                           exit_codeBQ,registros,Timestamp_Date,strerror=upload_GCS_BQ(creds,props,item[&#039;id&#039;])\r\nelse:\r\n    print(&#039;archivo vacio&#039;)\r\n\r\n#Al final del proceso, eliminamos los archivos descargados a nuestro servidor, para liberar el espacio ocupado\r\n\r\nfile_name=str(props.get(&#039;archivo_origen&#039;)).split(&#039;.&#039;)\r\n    fname = file_name[0]+&#039;.*&#039;\r\n    r = glob.glob(fname) #funci&oacute;n usada por python para buscar archivos\r\n    for i in r:\r\n        print(&#039;Eliminando..&#039;+str(i))\r\n        os.remove(i)\r\n <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6483e80 elementor-widget elementor-widget-text-editor\" data-id=\"6483e80\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A continuaci\u00f3n, el c\u00f3digo de la funci\u00f3n <strong>upload_GCS_BQ <\/strong>el cual realiza la ingesta del archivo al proyecto de Google Cloud definido en el archivo de configuraci\u00f3n.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-31d7e6f elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"31d7e6f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>#Librerias de GCP \r\nfrom google.cloud import bigquery\r\nfrom google.cloud import storage\r\nfrom google.api_core.exceptions import BadRequest\r\nfrom google.cloud.exceptions import NotFound\r\nfrom apiclient.errors import HttpError\r\n#Biblioteca de Python para manejo de archivos csv\r\nimport csv\r\n\r\ndef upload_GCS_BQ(creds,props,file_id):\r\n    \r\n    exit_codeBQ=0\r\n    strerror=&quot;&quot;\r\n    registros=0\r\n    Timestamp_Date = datetime.datetime.today().strftime(&#039;%Y-%m-%d %H:%M:%S.%f %Z&#039;) # obtenemos la fecha de sistema en formato Timestamp\r\n   \r\n        #Se realiza la carga a Google Cloud Storage\r\n        Current_Date = datetime.datetime.today().strftime (&#039;%Y-%b-%d %H_%M_%S&#039;)\r\n        #Dentro de props, vienen las propiedades del archivo\r\n        #a cargar, dividimos el nombre del archivo para agregarle \r\n        #la fecha y as&iacute; crear un archivo de respaldo\r\n        if props.get(&#039;archivo_origen&#039;).find(&#039;.&#039;)!=-1:\r\n            file_part=props.get(&#039;archivo_origen&#039;).split(&#039;.&#039;,1)\r\n            filename_bkp=file_part[0]+&#039; &#039;+str(Current_Date)+&#039;.&#039;+file_part[1]\r\n        else:\r\n            filename_bkp=props.get(&#039;archivo_origen&#039;)+str(Current_Date)\r\n        #usando funciones de las bibliotecas de google se realiza la carga del archivo a Google Cloud Storage\r\n        try:\r\n            bucket = creds.get(&#039;clientGS&#039;).get_bucket(props.get(&#039;Bucket_GCS&#039;))    \r\n\r\n            blob = bucket.blob(props.get(&#039;Path_GCS&#039;)+props.get(&#039;archivo_origen&#039;))\r\n            blob.upload_from_filename(props.get(&#039;archivo_origen&#039;))\r\n\r\n            registros=0\r\n\r\n            dest_bucket = creds.get(&#039;clientGS&#039;).get_bucket(props.get(&#039;Bucket_GCS&#039;))\r\n\r\n            new_blob_name=props.get(&#039;Path_GCS_bkp&#039;)+filename_bkp\r\n            new_blob = bucket.copy_blob(\r\n                             blob, dest_bucket, new_blob_name)\r\n\r\n\r\n            #Seteamos la variable exit_codeBQ en 1 para validar que la carga fue exitosa\r\n            exit_codeBQ=1\r\n        #si hay errores en la carga se setea la variable a 0\r\n        except BadRequest as e:\r\n            for err in e.errors:\r\n                error=err\r\n            exit_codeBQ=0\r\n <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ac0e6f elementor-widget elementor-widget-text-editor\" data-id=\"0ac0e6f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>La segunda parte de la funci\u00f3n realiza la carga a BigQuery, a partir del archivo que ya est\u00e1 en nuestro bucket de Google Cloud Storage<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9aae8b2 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"9aae8b2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'># Configuramos las opciones de la tabla definidas en el API de BigQuery\r\n        dataset_ref =   creds.get(&#039;clientBQ&#039;).dataset(str(props.get(&#039;DataSet_BQ&#039;)))\r\n        job_config = bigquery.LoadJobConfig()\r\n        job_confighis = bigquery.LoadJobConfig()\r\n        job_config.skip_leading_rows = 1\r\n        job_confighis.skip_leading_rows=1\r\n        job_config.field_delimiter = &#039;|&#039;\r\n        job_confighis.field_delimiter = &#039;|&#039;\r\n        job_config.write_disposition = &#039;WRITE_TRUNCATE&#039;\r\n        job_confighis.write_disposition = &#039;WRITE_APPEND&#039;\r\n        job_config.autodetect=True\r\n        job_confighis.autodetect=True\r\n\r\n#Establecemos el formato de origen de nuestro archivo como CSV\r\n        job_config.source_format = bigquery.SourceFormat.CSV\r\n        job_confighis.source_format = bigquery.SourceFormat.CSV\r\n        uri = &quot;gs:\/\/&quot;+props.get(&#039;Bucket_GCS&#039;)+&quot;\/&quot;+props.get(&#039;Path_GCS&#039;)+props.get(&#039;archivo_origen&#039;) #Este es el path de nuestro archive en Cloud Storage\r\n\r\n        try:\r\n            load_job = creds.get(&#039;clientBQ&#039;).load_table_from_uri(\r\n                uri, dataset_ref.table(props.get(&#039;Tabla&#039;)), job_config=job_config)  # API request\r\n\r\n            load_job.result()  #Espera a que termine la carga de la tabla.\r\n            destination_table = creds.get(&#039;clientBQ&#039;).get_table(dataset_ref.table(props.get(&#039;Tabla&#039;)))\r\n            registros=destination_table.num_rows\r\n#Obtenemos el id de la tabla a partir de las propiedades definidas            \r\ntable_id=str(props.get(&#039;proyecto&#039;)) +&#039;.&#039;+str(props.get(&#039;DataSet_BQ&#039;))+&#039;.&#039;+str(props.get(&#039;Tabla&#039;))\r\n\r\n            table = creds.get(&#039;clientBQ&#039;).get_table(table_id)  \r\n            \r\n\r\n\r\n\r\n#Agregamos un campo para colocar la fecha de modificaci&oacute;n de la tabla\r\n            original_schema = table.schema\r\n            new_schema = original_schema[:]  # Creates a copy of the schema.\r\n            new_schema.append(bigquery.SchemaField(&quot;FECHA_MODIFICACION&quot;, &quot;TIMESTAMP&quot;))\r\n\r\n            table.schema = new_schema\r\n            table = creds.get(&#039;clientBQ&#039;).update_table(table, [&quot;schema&quot;])  \r\n\r\n#Hacemos un update para agregar la fecha de modificaci&oacute;n\r\nqueryUpdate=&quot;UPDATE &quot;+str(props.get(&#039;DataSet_BQ&#039;))+&quot;.&quot;+str(props.get(&#039;Tabla&#039;)) +&quot; SET FECHA_MODIFICACION = TIMESTAMP(&#039;&quot;+Timestamp_Date.strip() +&quot;&#039;) WHERE TRUE&quot;\r\n            dml_statement = (&quot;UPDATE &quot;+str(props.get(&#039;DataSet_BQ&#039;))+&quot;.&quot;+str(props.get(&#039;Tabla&#039;)) +&quot; SET FECHA_MODIFICACION = TIMESTAMP(&#039;&quot;+Timestamp_Date.strip() +&quot;&#039;) WHERE TRUE&quot;)\r\n            query_job = creds.get(&#039;clientBQ&#039;).query(dml_statement)  \r\n            query_job.result()  \r\n\r\n                     #Seteamos la variable exit_codeBQ en 1 para validar que la carga fue exitosa\r\n \r\n            exit_codeBQ=1\r\n  #si hay errores en la carga se setea la variable a 0\r\nexcept BadRequest as e:\r\n            for err in e.errors:\r\n                strerror=str(err)\r\n            \r\n            exit_codeBQ=0\r\n     \r\n    #Con este return devolvemos los valores de cada variable a la funci&oacute;n principal\r\n    return exit_codeBQ,registros,Timestamp_Date,strerror\r\n <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8fe7d10 elementor-widget elementor-widget-text-editor\" data-id=\"8fe7d10\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Este es el C\u00f3digo b\u00e1sico para cargar nuestros archivos en Google Cloud Storage y Big Query, haciendo uso de las funciones incluidas en sus APIs.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9026a6c elementor-widget elementor-widget-text-editor\" data-id=\"9026a6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Para mayor referencia de su uso, puedes consultar los siguientes enlaces: <\/strong><\/p><p>Google Drive: <a href=\"https:\/\/developers.google.com\/drive\/api\/v2\/about-sdk\">https:\/\/developers.google.com\/drive\/api\/v2\/about-sdk<\/a>Google Cloud Storage: <a href=\"https:\/\/cloud.google.com\/storage\/docs\/reference\/libraries#client-libraries-usage-python\">https:\/\/cloud.google.com\/storage\/docs\/reference\/libraries#client-libraries-usage-python<\/a>Google Big Query: <a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/libraries#client-libraries-usage-python\">https:\/\/cloud.google.com\/bigquery\/docs\/reference\/libraries#client-libraries-usage-python<\/a>Cargar un archivo CSV desde Cloud Storage:<a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/loading-data-cloud-storage-csv\">https:\/\/cloud.google.com\/bigquery\/docs\/loading-data-cloud-storage-csv<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-748711b elementor-widget elementor-widget-spacer\" data-id=\"748711b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-64a0f9e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"64a0f9e\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-ad8efb7\" data-id=\"ad8efb7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-222bfdf elementor-widget elementor-widget-heading\" data-id=\"222bfdf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">\u00bfQuieres saber m\u00e1s de lo que ofrecemos y ver otros casos de \u00e9xito?<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-545d91b elementor-align-center elementor-widget elementor-widget-button\" data-id=\"545d91b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"\/es\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">DESCUBRE BLUETAB<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-aa2fc0b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"aa2fc0b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-8b166e3\" data-id=\"8b166e3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-3d42ec3\" data-id=\"3d42ec3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a576822 elementor-share-buttons--view-icon elementor-share-buttons--skin-minimal elementor-share-buttons--shape-circle elementor-grid-0 elementor-share-buttons--color-official elementor-widget elementor-widget-share-buttons\" data-id=\"a576822\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"share-buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_twitter\" role=\"button\" tabindex=\"0\" aria-label=\"Share on twitter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-twitter\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_linkedin\" role=\"button\" tabindex=\"0\" aria-label=\"Share on linkedin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-linkedin\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e6097d2 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"e6097d2\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a66a650\" data-id=\"a66a650\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-38e61b8 elementor-widget elementor-widget-text-editor\" data-id=\"38e61b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>SOLUCIONES, <\/b>SOMOS EXPERTOS<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-9975abb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9975abb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-e5edefb\" data-id=\"e5edefb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0628f91 elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"0628f91\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/data-strategy\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"strategy-opt\" data-bg-image=\"url(https:\/\/www.bluetab.co.uk\/wp-content\/uploads\/2020\/10\/strategy-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tDATA STRATEGY\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-8724c63\" data-id=\"8724c63\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bc8b25d elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"bc8b25d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/data-fabric\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"fabric-opt\" data-bg-image=\"url(https:\/\/www.bluetab.co.uk\/wp-content\/uploads\/2020\/10\/fabric-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tDATA FABRIC\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-ddc996d\" data-id=\"ddc996d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1d384cf elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"1d384cf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/augmented-analytics\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"AUGMENTED-ANALYTICS-opt\" data-bg-image=\"url(https:\/\/www.bluetab.co.uk\/wp-content\/uploads\/2020\/10\/AUGMENTED-ANALYTICS-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tAUGMENTED ANALYTICS\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-f61bae8\" data-id=\"f61bae8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f3fe106 elementor-widget elementor-widget-text-editor\" data-id=\"f3fe106\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Te puede interesar<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b98d665 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b98d665\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6f88005\" data-id=\"6f88005\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e572126 elementor-widget elementor-widget-spacer\" data-id=\"e572126\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Mi experiencia en el mundo de Big Data &#8211; Parte II David Emmanuel Reyes N\u00fa\u00f1ez Senior Data Engineer Share on twitter Share on linkedin En la entrega anterior (adjunto) creamos los scripts para enlistar y descargar archivos desde Google Drive hacia nuestro filesystem local. En esta entrega continuaremos con el c\u00f3digo de la funci\u00f3n processDriveFiles.py [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":12352,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"content-sidebar","footnotes":""},"categories":[19,633],"tags":[],"class_list":{"0":"post-13143","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-blog","8":"category-tech-en","9":"entry"},"uagb_featured_image_src":{"full":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel.png",4096,2304,false],"thumbnail":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-150x150.png",150,150,true],"medium":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-300x169.png",300,169,true],"medium_large":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-768x432.png",768,432,true],"large":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-1024x576.png",1024,576,true],"1536x1536":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-1536x864.png",1536,864,true],"2048x2048":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-2048x1152.png",2048,1152,true],"sidebar-featured":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-75x75.png",75,75,true],"genesis-singular-images":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/10\/emanuel-702x526.png",702,526,true]},"uagb_author_info":{"display_name":"Bluetab","author_link":"https:\/\/bluetab.co.uk\/en\/author\/user\/"},"uagb_comment_info":0,"uagb_excerpt":"Mi experiencia en el mundo de Big Data &#8211; Parte II David Emmanuel Reyes N\u00fa\u00f1ez Senior Data Engineer Share on twitter Share on linkedin En la entrega anterior (adjunto) creamos los scripts para enlistar y descargar archivos desde Google Drive hacia nuestro filesystem local. En esta entrega continuaremos con el c\u00f3digo de la funci\u00f3n processDriveFiles.py&hellip;","_links":{"self":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/13143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/comments?post=13143"}],"version-history":[{"count":1,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/13143\/revisions"}],"predecessor-version":[{"id":13144,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/13143\/revisions\/13144"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/media\/12352"}],"wp:attachment":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/media?parent=13143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/categories?post=13143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/tags?post=13143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}