{"id":2560,"date":"2018-08-18T18:25:37","date_gmt":"2018-08-18T21:25:37","guid":{"rendered":"http:\/\/www.geekosas.com\/?p=2560"},"modified":"2018-08-18T18:28:37","modified_gmt":"2018-08-18T21:28:37","slug":"escribir-en-redshift-desde-r-a-toda-velocidad","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/es\/2018\/08\/18\/escribir-en-redshift-desde-r-a-toda-velocidad\/","title":{"rendered":"Escribir en Redshift desde R a toda velocidad"},"content":{"rendered":"<p>Como muchos saben, <a href=\"https:\/\/aws.amazon.com\/redshift\/\">Redshift<\/a> es un fork de <a href=\"https:\/\/www.postgresql.org\/\">Postgres<\/a> hecho por <a href=\"https:\/\/aws.amazon.com\/\">Amazon<\/a> para entregar un servicio de Data Warehouse, la gran diferencia entre estos 2 productos es que el primero es una base de datos columnar y comprimida, mientras que el segundo no.<\/p>\n<p>Las bases de datos columnares son muy r\u00e1pidas para realizar agregaciones y cruces, pero no tanto para la inserci\u00f3n de registros (no esperes mas de 4 registros por segundo con un insert normal en Redshift), por lo que en general tienen alguna v\u00eda no standard. En el caso de Redshift el m\u00e9todo es el siguiente:<\/p>\n<ol>\n<li>Si no existe la tabla en la base de datos: cr\u00e9ela.<\/li>\n<li>Guarde la la tabla que quiere cargar en S3, idealmente en varios archivos CSV comprimidos en gzip.<\/li>\n<li>Desde Redshift llame al comando COPY para leer los archivos de S3 y cargarlos en la Base de Datos.<\/li>\n<\/ol>\n<p>Como ven, no es un proceso standard, por lo que\u00a0<a href=\"https:\/\/github.com\/sicarul\">sicarul<\/a>\u00a0cre\u00f3 la librer\u00eda\u00a0<a href=\"https:\/\/github.com\/sicarul\/redshiftTools\">redshiftTools<\/a>\u00a0que realiza todo este proceso secuencial mente, pero la librer\u00eda era bastante lenta, para cargar un un dataset de 1.5 millones de registros y 800 columnas, toma 21 minutos, por lo que decid\u00ed revisar el codigo a ver si pod\u00eda realizar algunas optimizaciones, dentro las las cuales encontr\u00e9:<\/p>\n<ol>\n<li>El paquete usaba write.csv\u00a0para generar los CSV, por lo que migr\u00e9 a <a href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/index.html\">fwrite<\/a>.<\/li>\n<li>La compresi\u00f3n de los CSV era secuencial, por lo que paralelic\u00e9 compresi\u00f3n de los CSV usando <a href=\"https:\/\/cran.r-project.org\/web\/packages\/future\/index.html\">future<\/a>.<\/li>\n<li>Solo exist\u00eda una funci\u00f3n para realizar un update de una tabla, lo que era lento, por lo que cre\u00e9 una funci\u00f3n que solo inserta registros en una tabla.<\/li>\n<\/ol>\n<p>Al realizar todos estos cambios, el proceso completo de carga baj\u00f3 a menos de 6 minutos, siendo un 350% m\u00e1s r\u00e1pido que el ya existente (por lo que ya llen\u00e9 un pull request al repositorio oficial).<\/p>\n<p>Mientras el pull request es aceptado, pueden disfrutar de la libreria optimizada en mi <a href=\"https:\/\/github.com\/danielfm123\/redshiftTools\">GitHub<\/a>, pueden instalarlo con los siguientes commandos desde R:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\ninstall.packages(&quot;aws.ec2metadata&quot;, repos = c(cloudyr = &quot;http:\/\/cloudyr.github.io\/drat&quot;, getOption(&quot;repos&quot;)))\r\npackages = c(&quot;devtools&quot;, &quot;httr&quot;, &quot;package_n&quot;,&quot;aws.s3&quot;, &quot;Rcpp&quot;,&quot;DBI&quot;,&quot;data.table&quot;,&quot;future&quot;,&quot;future.apply&quot;,&quot;R.utils&quot;,&quot;dplyr&quot;)\r\nfor(pack in packages){\r\n  if(!pack %in% rownames(installed.packages())){\r\n    print(paste(&quot;installing&quot;,pack))\r\n    install.packages(pack)\r\n  }\r\n}\r\ndevtools::install_github(&quot;danielfm123\/redshiftTools&quot;)\r\n<\/pre>\n<p>un peque\u00f1o ejemplo de como usarlo en el siguiente c\u00f3digo:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n\r\nlibrary(data.table)\r\nlibrary(RPostgreSQL)\r\nlibrary(toolkitEntel)\r\nsetDTthreads(0)\r\n\r\ndataset = fread(&quot;Ruta a algun archivo que se quiera leer&quot;,data.table = F,sep = &quot;|&quot;,encoding = &quot;Latin-1&quot;,nrows = -1)\r\n\r\n#COnectar a SQL\r\ncon = dbConnect(\r\n  dbDriver(&quot;PostgreSQL&quot;),\r\n  dbname = &quot;nombre base de datos&quot;,\r\n  user = &quot;usuario&quot;,\r\n  password = &quot;contrase\u00f1na&quot;,\r\n  host = &quot;ip del servidor&quot;\r\n)\r\n\r\n# Crear una tabla, detecta tipos de columnas\r\nrs_create_table(\r\n  dataset,\r\n  dbcon = con,\r\n  table_name = 'table_name',\r\n  bucket = &quot;bucket_name&quot;,\r\n  region = &quot;us-east-2&quot;,\r\n  keys = &quot;AWS AIM KEY de S3&quot;,\r\n  secret_key = &quot;AWS AIM SECRET de S3&quot;\r\n)\r\n\r\n# agregar data a una tabla existente\r\nrs_append_table(\r\n  dataset,\r\n  dbcon = con,\r\n  table_name = 'table_name',\r\n  bucket = &quot;bucket_name&quot;,\r\n  region = &quot;us-east-2&quot;,\r\n  keys = &quot;AWS AIM KEY de S3&quot;,\r\n  secret_key = &quot;AWS AIM SECRET de S3&quot;\r\n)\r\n\r\n#desconectarse de redshift\r\ndbDisconnect(con)\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Como muchos saben, Redshift es un fork de Postgres hecho por Amazon para entregar un servicio de Data Warehouse, la gran diferencia entre estos 2 <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/es\/2018\/08\/18\/escribir-en-redshift-desde-r-a-toda-velocidad\/\" title=\"Escribir en Redshift desde R a toda velocidad\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":2561,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-2560","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/RtoRedshift.png?fit=600%2C300&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-Fi","jetpack-related-posts":[{"id":3115,"url":"https:\/\/geekosas.com\/index.php\/es\/2022\/05\/07\/buenas-practicas-al-programar-con-codigo\/","url_meta":{"origin":2560,"position":0},"title":"Buenas pr\u00e1cticas al programar (con c\u00f3digo)","author":"Daniel Fischer","date":"2022-05-07","format":false,"excerpt":"Muchos disfrutan programar y resolver laberintos algor\u00edtmicos en su lenguaje favorito, pero lo que a nadie le gusta, es meterse en un c\u00f3digo viejo o incluso peor, en un c\u00f3digo escrito por otro. A m\u00ed me ha tocado hacerlo ya varias veces, algunas veces ha sido malo, otras veces peor,\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":2771,"url":"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/","url_meta":{"origin":2560,"position":1},"title":"Comparativa entre Julia, Python y R","author":"Daniel Fischer","date":"2020-04-07","format":false,"excerpt":"La discusi\u00f3n sobre que lenguaje es el mejor para analizar datos puede llevarnos a conversaciones mas apasionadas que por temas como religi\u00f3n o pol\u00edtica. Pero como Data-Scientist debemos enfocarnos en la evidencia emp\u00edrica, las dimensiones con las que se podr\u00edan comparar son muchas: Comunidad, Performance, Editores, Gestor de Paquetes, Encapsulaci\u00f3n\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/external-content.duckduckgo.com_.jpg?fit=474%2C312&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":1452,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/11\/19\/multy-core-performance-en-r\/","url_meta":{"origin":2560,"position":2},"title":"Multy-Core Performance en R","author":"Daniel Fischer","date":"2016-11-19","format":false,"excerpt":"Introducci\u00f3n Hace unos d\u00edas, caminando por ah\u00ed, vi que estaban vendiendo un HP Proliant DL360 G6 de segunda mano, para los que no saben es un servidor de alto rendimiento del a\u00f1o 2010. Por mi\u00a0inter\u00e9s por el el Data Science y BIG DATA, este juguete ser\u00e1 util para un diplomado\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":1380,"url":"https:\/\/geekosas.com\/index.php\/es\/2017\/02\/20\/video-juegos-y-data-science\/","url_meta":{"origin":2560,"position":3},"title":"Video-juegos y Estadistica","author":"Daniel Fischer","date":"2017-02-20","format":false,"excerpt":"La industria de los videojuegos ha crecido exponencialmente, se han creado nuevos g\u00e9neros de juegos, nuevos modelos de negocios, nuevos tipos de gamers y nuevos dispositivos para jugar, pero lo que no cambia es que siguen existiendo los llamados juegos triple A. Los juegos triple A se caracterizan por pertenecer\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/02\/fifa-300x121.jpg?resize=700%2C400 2x"},"classes":[]},{"id":2186,"url":"https:\/\/geekosas.com\/index.php\/es\/2017\/08\/09\/dictare-un-curso-de-r\/","url_meta":{"origin":2560,"position":4},"title":"Dictar\u00e9 un curso de R","author":"Daniel Fischer","date":"2017-08-09","format":false,"excerpt":"El curso ser\u00e1 en Microsoft Chile el d\u00eda 22 de septiembre: El intensivo R es un evento pensado para quienes tienen necesidades de an\u00e1lisis de datos y creaci\u00f3n de modelos\u00a0en su trabajo y quieran\u00a0obtener en 1 d\u00eda\u00a0los conocimientos te\u00f3ricos y pr\u00e1cticos para comenzar a resolver sus desaf\u00edos anal\u00edticos con esta\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/RStudio-Ball.png?fit=1000%2C1000&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":828,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/05\/08\/k-means\/","url_meta":{"origin":2560,"position":5},"title":"Segmentar clientes paso a paso","author":"Daniel Fischer","date":"2016-05-08","format":false,"excerpt":"Anteriormente escrib\u00ed sobre las redes neuronales (click aca para verlo).\u00a0Las redes neuronales y todos los otros \"m\u00e9todos supervisados\" son utilizados cuando\u00a0posee una muestra de valores\u00a0predecir, pero cuando sabes lo que quieres\u00a0lograr, pero no tienes una muestra del valor a predecir, se utilizan los llamados \"m\u00e9todos no supervisados\" Un cl\u00e1sico problema\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/05\/kmenas6.png?fit=620%2C539&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/05\/kmenas6.png?fit=620%2C539&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/05\/kmenas6.png?fit=620%2C539&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=2560"}],"version-history":[{"count":3,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2560\/revisions"}],"predecessor-version":[{"id":2564,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2560\/revisions\/2564"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/2561"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=2560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=2560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=2560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}