{"id":42571,"date":"2024-01-26T12:03:45","date_gmt":"2024-01-26T11:03:45","guid":{"rendered":"https:\/\/keepler.io\/?p=42571"},"modified":"2024-01-26T12:03:54","modified_gmt":"2024-01-26T11:03:54","slug":"traduccion-codigo-script-eficaces","status":"publish","type":"post","link":"https:\/\/keepler.io\/es\/2024\/01\/26\/traduccion-codigo-script-eficaces\/","title":{"rendered":"Traducci\u00f3n de c\u00f3digo para que los script sean m\u00e1s eficaces en un entorno de producci\u00f3n"},"content":{"rendered":"<p>En este art\u00edculo voy a explicar el escenario en el que he estado trabajando el \u00faltimo a\u00f1o traduciendo c\u00f3digo de Pandas a PySpark para <strong>mejorar los tiempos de ejecuci\u00f3n<\/strong> y hacer m\u00e1s <strong>eficientes<\/strong> los scripts en un entorno de producci\u00f3n. Empecemos entendiendo estas tecnolog\u00edas.<\/p>\n<p><a href=\"https:\/\/pandas.pydata.org\/docs\/\" target=\"_blank\" rel=\"noopener\"><strong>Pandas<\/strong><\/a> es una librer\u00eda para trabajar con conjuntos de datos. Tiene funciones para<strong> analizar<\/strong>, limpiar, explorar y manipular datos. Pandas es muy adecuado para trabajar con conjuntos de datos de tama\u00f1o peque\u00f1o o mediano en una sola m\u00e1quina. Cuando llega el momento de trabajar a mayor escala, empezamos a hablar de <a href=\"https:\/\/spark.apache.org\/docs\/latest\/api\/python\/index.html\" target=\"_blank\" rel=\"noopener\"><strong>PySpark<\/strong><\/a>, que est\u00e1 dise\u00f1ado para el procesamiento distribuido de grandes conjuntos de datos en varias m\u00e1quinas escribiendo aplicaciones Spark mediante las API de Python. Tiene un motor de an\u00e1lisis unificado para el procesamiento de datos a gran escala.<\/p>\n<p>Convertir un DataFrame de Pandas en un DataFrame de PySpark puede ser necesario cuando necesitas <strong>escalar<\/strong> tu procesamiento de datos para manejar conjuntos de datos m\u00e1s grandes, Spark ofrece la posibilidad de ejecutar operaciones en m\u00faltiples m\u00e1quinas, a diferencia de Pandas, lo cual es esencial.<\/p>\n<p>Uno de los principales<strong> inconvenientes<\/strong> de <strong>Pandas<\/strong> son sus <strong>problemas de escalabilidad y rendimiento<\/strong>. Pandas no est\u00e1 dise\u00f1ado para la computaci\u00f3n distribuida, y puede tener problemas con conjuntos de datos grandes o complejos que superen la capacidad de memoria de una sola m\u00e1quina. Pandas tambi\u00e9n depende del int\u00e9rprete de Python, que no es muy eficiente para el procesamiento paralelo o concurrente. Pandas puede ser lento y consumir mucha memoria para ciertas operaciones, como ordenar, unir o a\u00f1adir grandes marcos de datos.<\/p>\n<p>Una de las principales<strong> ventajas<\/strong> de <strong>PySpark<\/strong> es su <strong>escalabilidad y capacidad de rendimiento<\/strong>. PySpark puede manejar conjuntos de datos masivos y complejos que abarcan m\u00faltiples nodos, y aprovechar las capacidades de computaci\u00f3n distribuida y en memoria de Spark para acelerar el procesamiento de datos y las tareas de aprendizaje autom\u00e1tico. Tambi\u00e9n admite la evaluaci\u00f3n perezosa, lo que significa que s\u00f3lo ejecuta operaciones cuando se desencadena una acci\u00f3n y evita c\u00e1lculos innecesarios. PySpark es adecuado para trabajar con <strong>big data<\/strong>, streaming de datos o aplicaciones de advanced analytics y machine learning.<\/p>\n<p>Antes de empezar a traducir c\u00f3digo Pandas a PySpark, necesitamos crear una <strong>Spark Session<\/strong>. Es el punto de entrada a la programaci\u00f3n de Spark con la API DataSet y DataFrame. PySpark proporciona herramientas de transformaci\u00f3n de datos en un m\u00f3dulo llamado pyspark.sql.functions, este m\u00f3dulo almacena muchos m\u00e9todos funcionales para transformar datos como convertir a DateTime, concatenar columnas, ventanas, tablas din\u00e1micas, etc.<\/p>\n<p>Uno de los conjuntos de datos en los que he estado trabajando ten\u00eda 127 millones de datos, y todo el proceso estaba basado en Pandas, el notebook estaba usando 96 vCPU y 384 GiB de memoria, todo el script estaba tardando m\u00e1s de 30 minutos en completarse. El conjunto de datos ten\u00eda alrededor de 20 columnas de tipo string, datetime, integer y float. Pasamos todo el c\u00f3digo a PySpark utilizando 2 vCPU y 8 GiB de memoria y el tiempo total para ejecutar todo el script fue de unos 5 minutos.<\/p>\n<p>Aqu\u00ed podemos ver un ejemplo sobre una transformaci\u00f3n de pivote a traducir. <strong>El cambio m\u00e1s notable fue en el tiempo de procesamiento con una diferencia de 5 minutos en Pandas y 43 segundos en PySpark.<\/strong><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"42565\" data-permalink=\"https:\/\/keepler.io\/es\/2024\/01\/26\/traduccion-codigo-script-eficaces\/keepler-panda-pyspark-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark.png?fit=1402%2C644&amp;ssl=1\" data-orig-size=\"1402,644\" data-comments-opened=\"1\" data-image-title=\"keepler-panda-pyspark\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark.png?fit=1024%2C470&amp;ssl=1\" class=\"alignnone wp-image-42565 size-full\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark.png?resize=1080%2C496&#038;ssl=1\" alt=\"\" width=\"1080\" height=\"496\" srcset=\"https:\/\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark.png 1402w, https:\/\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark-1280x588.png 1280w, https:\/\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark-980x450.png 980w, https:\/\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark-480x220.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1402px, 100vw\" \/><\/p>\n<p>Con <strong>datos que crecen exponencialmente<\/strong>, operaciones complejas como la fusi\u00f3n o agrupaci\u00f3n de datos requieren paralelizaci\u00f3n y computaci\u00f3n distribuida. Como vimos en el ejemplo anterior, estas operaciones son muy lentas y bastante caras y se hacen dif\u00edciles de manejar con un DataFrame de Pandas, que no soporta paralelizaci\u00f3n.<\/p>\n<p>Para resumir me gustar\u00eda a\u00f1adir las principales ventajas de PySpark en t\u00e9rminos de rendimiento, velocidad y consumo de memoria:<\/p>\n<h3>Rendimiento<\/h3>\n<p>Pandas se utiliza para manipular y analizar conjuntos de datos de menos de 10 GB. Por lo tanto, PySpark, cuando se utiliza con un sistema de computaci\u00f3n distribuida, da mejor rendimiento que pandas y adem\u00e1s utiliza conjuntos de datos distribuidos resilientes (RDDs) para trabajar en paralelo sobre los datos.<\/p>\n<h3>Velocidad<\/h3>\n<p>Para grandes conjuntos de datos, PySpark es siempre m\u00e1s r\u00e1pido que Pandas. Podemos realizar c\u00e1lculos paralelos sobre conjuntos de datos utilizando PySpark. Spark utiliza cach\u00e9 en memoria, cosa que Pandas no tiene.<\/p>\n<h3>Consumo de memoria<\/h3>\n<p>Pyspark hace un procesamiento perezoso. No mantiene todos los datos en memoria. Cuando se necesitan datos, s\u00f3lo se recuperan los datos del disco. Pero Pandas mantiene todos los datos en memoria. Por lo tanto, el consumo de memoria es siempre mayor con Pandas.<\/p>\n<p>En conclusi\u00f3n, para conjuntos de datos peque\u00f1os o medianos, Pandas es una mejor opci\u00f3n, ya que puede caber en la memoria de una sola m\u00e1quina,<strong> pero para grandes cantidades de datos PySpark muestra un mejor rendimiento en todos los pasos<\/strong> porque est\u00e1 dise\u00f1ado para aprovechar los recursos inform\u00e1ticos distribuidos para procesar que grandes cantidades de datos a trav\u00e9s de un cl\u00faster de m\u00e1quinas y es m\u00e1s adecuado para el procesamiento de datos complejos que implica m\u00faltiples etapas de transformaci\u00f3n de datos y an\u00e1lisis.<\/p>\n<p>&nbsp;<\/p>\n<p>Imagen: Unsplash | Joshua Aragon<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo voy a explicar el escenario en el que he estado trabajando el \u00faltimo a\u00f1o traduciendo c\u00f3digo de Pandas a PySpark para mejorar los tiempos de ejecuci\u00f3n y hacer m\u00e1s eficientes los scripts en un entorno de producci\u00f3n. Empecemos entendiendo estas tecnolog\u00edas. Pandas es una librer\u00eda para trabajar con conjuntos de datos. Tiene [&hellip;]<\/p>\n","protected":false},"author":134360170,"featured_media":42570,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"Traducci\u00f3n de c\u00f3digo para que los script sean m\u00e1s eficaces","_seopress_titles_desc":"En este art\u00edculo explicamos c\u00f3mo hemos estado trabajando en la traducci\u00f3n de c\u00f3digo de Pandas a PySpark para mejorar los tiempos de ejecuci\u00f3n y hacer los scripts m\u00e1s eficientes","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"none","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"both","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"traduciendo c\u00f3digo de Pandas a PySpark,mejorar los tiempos de ejecuci\u00f3n","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","content-type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","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},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[224],"tags":[376,284,377,378],"class_list":["post-42571","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","tag-codigo-es","tag-code-es","tag-pandas-es","tag-pyspark-es"],"jetpack_publicize_connections":[],"jetpack_likes_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9CeZw-b4D","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2024\/01\/keepler-panda-pyspark-principal.jpg?fit=1280%2C450&ssl=1","_links":{"self":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/42571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/users\/134360170"}],"replies":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/comments?post=42571"}],"version-history":[{"count":4,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/42571\/revisions"}],"predecessor-version":[{"id":42577,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/42571\/revisions\/42577"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media\/42570"}],"wp:attachment":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media?parent=42571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/categories?post=42571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/tags?post=42571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}