{"id":12323,"date":"2021-10-14T09:18:21","date_gmt":"2021-10-14T09:18:21","guid":{"rendered":"https:\/\/bluetab.net\/?p=12323"},"modified":"2021-10-14T09:18:21","modified_gmt":"2021-10-14T09:18:21","slug":"mi-experiencia-en-big-data-i","status":"publish","type":"post","link":"https:\/\/bluetab.net\/en\/2021\/10\/mi-experiencia-en-big-data-i\/","title":{"rendered":"Mi experiencia en el mundo de Big Data &#8211; Parte I"},"content":{"rendered":"<h1>Mi experiencia en el mundo de Big Data &#8211; Parte I<\/h1>\n<figure><a href=\"https:\/\/www.linkedin.com\/in\/dreyes85\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Emanuel-150x150.jpeg\" alt=\"\" loading=\"lazy\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/in\/dreyes85\/\" target=\"_blank\" rel=\"noopener\">David Emmanuel Reyes N\u00fa\u00f1ez<\/a><\/h4>\n<p>Senior Data Engineer<\/p>\n<p>Share on twitter<br \/>\nShare on linkedin<\/p>\n<p>Hace casi dos a\u00f1os (septiembre 2019), no sab\u00eda absolutamente nada de tecnolog\u00edas Big Data, hoy s\u00e9 que, aunque ya conozco y he interactuado con algunas de ellas, me falta mucho camino por recorrer y muchas cosas por aprender. Todo empieza confiando en ti y a veces necesitas el impulso de alguien que conf\u00ede en ti.<\/p>\n<p>&nbsp;Me ha gustado tanto este tipo de tecnolog\u00edas que incluso en este par de a\u00f1os, he podido tomar un par de diplomados y concluir recientemente una Maestr\u00eda en An\u00e1lisis y Visualizaci\u00f3n de Datos.<\/p>\n<p>En esta ocasi\u00f3n quiero compartir una de las experiencias que he tenido con estas tecnolog\u00edas, la cual se trata de realizar ingestas de archivos hacia Google BigQuery&nbsp; y Google Cloud Storage, utilizando Google Drive como repositorio fuente.<\/p>\n<h2>\u00bfQu\u00e9 necesitamos?<\/h2>\n<p>En este primer articulo haremos uso de Google Drive API y Python 2.6 o superior.<\/p>\n<p>Necesitamos tambi\u00e9n tener proyecto de Google Cloud Platform con la API habilitada. Para crear un proyecto y habilitar una API, haz clic <a href=\"https:\/\/developers.google.com\/workspace\/guides\/create-project\">aqu\u00ed<\/a><\/p>\n<p>Debemos ver una pantalla similar a esta:<\/p>\n<p><img decoding=\"async\" width=\"922\" height=\"260\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia1.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia1.png 922w, https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia1-300x85.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia1-768x217.png 768w\" sizes=\"(max-width: 922px) 100vw, 922px\"><\/p>\n<p>Seleccionamos el tipo de aplicaci\u00f3n que necesitamos y se nos genera un archivo JSON, llamado credentials.json, que podemos descargar y ubicar en alg\u00fan directorio que sea sencillo de identificar:<\/p>\n<p><img decoding=\"async\" width=\"552\" height=\"331\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia2.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia2.png 552w, https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia2-300x180.png 300w\" sizes=\"(max-width: 552px) 100vw, 552px\"><\/p>\n<p>Tambi\u00e9n necesitamos credenciales de autorizaci\u00f3n para una aplicaci\u00f3n de escritorio. Para aprender a crear credenciales para una aplicaci\u00f3n de escritorio, haz clic <a href=\"https:\/\/developers.google.com\/workspace\/guides\/create-credentials\">aqu\u00ed<\/a>.<\/p>\n<p>Ejecutamos el siguiente comando en la consola para instalar las librer\u00edas que utilizaremos:<\/p>\n<pre><code class=\"language-python\">pip3 install google-api-python-client google-auth-httplib2 google-auth-oauthlib <\/code><\/pre>\n<p>Una vez que tenemos configurado nuestro ambiente, comenzamos a crear los m\u00f3dulos de nuestra aplicaci\u00f3n.<\/p>\n<ul>\n<li>Archivo de Configuraci\u00f3n<\/li>\n<\/ul>\n<p>Para nuestro primer script de Python, necesitamos un archivo que guarde nuestra configuraci\u00f3n de rutas y elementos, podemos llamarlo config.ini, y lo llenaremos como muestra el ejemplo que sigue:<\/p>\n<p><strong>[GENERAL_CONFIG] <\/strong><strong>\uf0df<\/strong><strong>&#8212;secci\u00f3n<\/strong>Key_file_location= path del archive json de credencialesscopes = <a href=\"https:\/\/www.googleapis.com\/auth\/drive\">https:\/\/www.googleapis.com\/auth\/drive<\/a> <a href=\"https:\/\/www.googleapis.com\/auth\/cloud-platform\">https:\/\/www.googleapis.com\/auth\/cloud-platform<\/a> (los scopes sirven para identificar las APIs que usaremos)&nbsp;CompressionLevel = 9ForwardX11 = yes&nbsp;<strong>[DRIVE_API] <\/strong><strong>\uf0df<\/strong><strong>&#8212; en esta secci\u00f3n colocamos los id\u2019s del Drive al que nos queremos conectar, se encuentra ubicado despu\u00e9s del ultimo slash (\/) de la URL:<\/strong><\/p>\n<p><img decoding=\"async\" width=\"449\" height=\"343\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia3.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia3.png 449w, https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/Miexperiencia3-300x229.png 300w\" sizes=\"(max-width: 449px) 100vw, 449px\"><\/p>\n<pre><code class=\"language-python\">drive_id = 1-jrMx9oDTOO9eN7ZGcU5tSZVTKtD\nfolder_2 = 1i70h0VBdL0Gzw9xR9FiO2gfBFxSQz <\/code><\/pre>\n<p>Creamos el script de Python que leera nuestro archive config.ini mediante el siguiente c\u00f3digo de Python:<\/p>\n<pre><code class=\"language-python\">import configparser\nimport datetime\ndef readConfig():\n    #Obtenemos la fecha del sistema, que nos servir\u00e1 para nombrar el archivo de Log\n    fileDate = datetime.datetime.today().strftime('%Y-%m-%d')\n    config = configparser.ConfigParser()\n    config.read('.\/config\/Config.ini') #path donde se ubica el archivo.ini\n    general_config=config['GENERAL_CONFIG'] #referencia a la seccion\n    drive_api=config['DRIVE_API']\n    readConfig.conf_key_file=general_config['key_file_location']\n    readConfig.scopes=general_config['scopes']\n    readConfig.team_drive=drive_api['team_drive']\n    #generamos el nombre para el archivo de log, con la fecha de sistema\n    fileLogMain='MyLogFile.log'\n    sfileLogMain =fileLogMain.split('.')\n    fileLogMain=sfileLogMain[0]+'_'+fileDate+'.'+sfileLogMain[1]\n <\/code><\/pre>\n<ul>\n<li>Archivo<strong> de par\u00e1metros<\/strong><\/li>\n<\/ul>\n<p><strong>Aqu\u00ed es donde comenzamos a hablar de GCP. <\/strong><strong>&nbsp;<\/strong>Si queremos descargar archivos espec\u00edficos de nuestro drive, tenemos que crear un archivo en donde le indiquemos el nombre, la extensi\u00f3n, el proyecto GCP de destino, el bucket de GS donde lo subiremos y el nombre de la tabla que crear\u00e1 en bigQuery.<\/p>\n<p>Creamos un archivo <strong>parameters.csv <\/strong>con la siguiente estructura:<\/p>\n<p>Nombre_Archivo|Proyecto_GCP|Bucket_GCP|DataSet_BQ|Tabla_BQ|Path_GS|Status<\/p>\n<pre><code class=\"language-python\">Archivo1.csv|mi_proyecto|mi_bucket|raw_data|mi_tabla_bq|path\/gs|1\nArchivo2.csv|mi_proyecto|mi_bucket2|raw_data|mi_tabla_bq|path2\/gs|0\n <\/code><\/pre>\n<p>La \u00faltima columna, indica el status para saber si se descargar\u00e1 o no el archivo (1=Activo, 0=Inactivo)<\/p>\n<p><strong>Nota: Debemos contar con permisos y credenciales para los proyectos a los que queramos subir el archivo, este tema lo iremos abordando en siguientes entregas. Ahora solo nos limitaremos a la parte de descargar un archivo desde Google Drive hacia nuestro disco local.<\/strong><\/p>\n<p>El script de Python para leer y descargar los archivos es el siguiente:<\/p>\n<pre><code class=\"language-python\">#Librerias para lectura del archivo, autenticaci\u00f3n de servicios y lectura de archivos csv\nfrom modules.readConfig import readConfig\nfrom modules.auth import get_service\nfrom modules.processDriveFiles import get_FoldersList\nimport logging\nimport csv\nimport os,glob\ndef readProperties():\n    #Configuramos los niveles de logging\n    logging.basicConfig(level=logging.INFO,\n                        format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',\n                        datefmt='%m-%d %H:%M',\n                        filename=readConfig.log_file_main,\n                        filemode='a')\n    logging.info('Inicio...')\n    #Comienza la lectura del archivo de par\u00e1metros\n   For row in reader:\n    with open(readConfig.params_file, 'r', encoding='utf-8') as f:\n        reader = csv.DictReader(f, delimiter='|')\n        props = {}\n        api_name='drive'\n        api_version='v3'\n        scopes=[readConfig.scopes]\n        key_file_location=readConfig.conf_key_file \n        #Validamos que el archivo que queremos est\u00e9 activo para poder descargarlo y guardamos los par\u00e1metros en un arreglo.\n        if row['Status']==1:\n                props ={'nombre_archivo':row['Nombre_Archivo],'proyecto':row['Proyecto_GCP'],'DataSet_BQ':row['DataSet_BQ'],'Tabla':row['Tabla_BQ'],'Bucket_GCP':row['Bucket_GCP'],'Path_GS':row['Path_GS'], 'Status':row['Status'\n#Funciones para autenticaci\u00f3n y obtener el listado de folders\ncreds = get_service(api_name,api_version,scopes,key_file_location,\n                        props) \n        get_FoldersList(creds,props)\n        f.close()\n#funcion get_service (ubicada en el m\u00f3dulo auth.py) Esta funci\u00f3n nos servir\u00e1 para seleccionar el archivo de credenciales que usaremos para autenticarnos en Google drive\ndef get_service(api_name, api_version, scopes, key_file_location,props):\n        key_file_location='.\/auth\/driveCredentials.json'\ncredentialsDrive = service_account.Credentials.from_service_account_file(\n            key_file_location, scopes=scopes)\n#funcion get_FoldersList. Una vez autenticados, nos permitir\u00e1 listar los folders de nuestro Google Drive de acuerdo con los par\u00e1metros que le enviemos. Esta contenida en el script processDriveFiles.py\ndef get_FoldersList(creds,props):\n    # Obtiene un listado de los Google Drive folders\n        done = True\n        logging.info('Ejecutando consulta: ')\n        query = \"mimeType!='application\/vnd.google-apps.folder' and name='\"+props.get('archivo_origen')+\"' and parents!='\"+readConfig.success_drive+\"' and parents!='\"+readConfig.failure_drive+\"' and starred=False and trashed=False\"\n        response = creds.get('service').files().list(\n                q=query,            \n                fields='*',  \n                orderBy='folder',\n                driveId=readConfig.team_drive,                \n                corpora='drive',\n                includeItemsFromAllDrives=True,\n                supportsAllDrives=True).execute()\n        items = response.get('files', [])\n        if not items:\n                logging.info('No se han encontrado archivos')\n        else:\n                for item in items:\n                #descargamos el archivo\n                    file_id = item['id']\n                    fh = io.FileIO(item['name'],'w')\n                    request = creds.get('service').files().get_media(fileId=file_id)\n                    fh = io.FileIO(item['name'],'w')\n                    downloader = MediaIoBaseDownload(fh, request)\n                    done = False\n       statusdw=0 \n       #Se realiza la descarga\n       while (done is False and int(statusdw)&lt;100):\n              file_ext=''\n              status, done = downloader.next_chunk()\n              logging.info('status: ')\n              statusdw=(int(status.progress())*100)  \n              logging.info(int(statusdw))\n              logging.info('Descargando: '+item['name']+\" %d%%.\" % int(statusdw))                      \n              logging.info('Descargando: '+item['name']+\" %d%%.\" % int(status.progress() * 100))\n <\/code><\/pre>\n<p><strong>En esta parte, ya debemos ver nuestro archive descargado en el directorio local de la aplicaci\u00f3n.&nbsp;&nbsp;&nbsp; <\/strong>&nbsp;&nbsp;<\/p>\n<p>Esta es la primera entrega de nuestro administrador de archivos, el objetivo de este desarrollo es llevar archivos desde Google Drive hacia Google Cloud. En la siguiente 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>\n<h5>\u00bfQuieres saber m\u00e1s de lo que ofrecemos y ver otros casos de \u00e9xito?<\/h5>\n<p><a href=\"\/\" role=\"button\"><br \/>\nDESCUBRE BLUETAB<br \/>\n<\/a><br \/>\nShare on twitter<br \/>\nShare on linkedin<\/p>\n<p><b>SOLUCIONES, <\/b>SOMOS EXPERTOS<\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/p>\n<h5>\n\t\t\t\t\t\tDATA STRATEGY<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-strategy\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/data-fabric\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-fabric\/\"><\/p>\n<h5>\n\t\t\t\t\t\tDATA FABRIC<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-fabric\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/augmented-analytics\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/augmented-analytics\/\"><\/p>\n<h5>\n\t\t\t\t\t\tAUGMENTED ANALYTICS<\/h5>\n<p><\/a><a href=\"\/soluciones\/augmented-analytics\/\">\t\t\t\t\t\t<\/a><\/p>\n<p>Te puede interesar<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mi experiencia en el mundo de Big Data &#8211; Parte I David Emmanuel Reyes N\u00fa\u00f1ez Senior Data Engineer Share on twitter Share on linkedin Hace casi dos a\u00f1os (septiembre 2019), no sab\u00eda absolutamente nada de tecnolog\u00edas Big Data, hoy s\u00e9 que, aunque ya conozco y he interactuado con algunas de ellas, me falta mucho camino [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":20796,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,30],"tags":[],"class_list":["post-12323","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-es","category-tech-en"],"acf":[],"jetpack_featured_media_url":"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/10\/emanuel-scaled.png","_links":{"self":[{"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/posts\/12323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/comments?post=12323"}],"version-history":[{"count":0,"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/posts\/12323\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/media\/20796"}],"wp:attachment":[{"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/media?parent=12323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/categories?post=12323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bluetab.net\/en\/wp-json\/wp\/v2\/tags?post=12323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}