{"id":14578,"date":"2021-05-25T09:58:34","date_gmt":"2021-05-25T09:58:34","guid":{"rendered":"https:\/\/timi.eu\/?p=14578"},"modified":"2021-06-07T13:49:02","modified_gmt":"2021-06-07T13:49:02","slug":"fuzzy-matching-tableau-prep-builder-vs-anatella","status":"publish","type":"post","link":"https:\/\/timi.eu\/es\/blog-es\/fuzzy-matching-tableau-prep-builder-vs-anatella\/","title":{"rendered":"Fuzzy matching: Tableau Prep Builder vs Anatella"},"content":{"rendered":"\n<div\n\t role=\"navigation\" aria-label=\"Selector de idioma\" class=\"wpml-ls-statics-shortcode_actions wpml-ls wpml-ls-legacy-dropdown js-wpml-ls-legacy-dropdown\">\n\t<ul>\n\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-es wpml-ls-current-language wpml-ls-item-legacy-dropdown\">\n\t\t\t<a href=\"#\" hreflang=\"\" lang=\"\" class=\"js-wpml-ls-item-toggle wpml-ls-item-toggle\" aria-current=\"page\" aria-expanded=\"false\" aria-controls=\"wpml-ls-submenu-default\" aria-label=\"Selector de idioma, pulse tab para navegar a otros idiomas\" title=\"Cambiar a Espa\u00f1ol\">\n\t\t\t\t                                    <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/es.svg\"\n            alt=\"\"\n            loading=\"lazy\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-native\">Espa\u00f1ol<\/span><\/a>\n\n\t\t\t<ul id=\"wpml-ls-submenu-default\" class=\"wpml-ls-sub-menu\">\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-en wpml-ls-first-item\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/\" hreflang=\"en\" lang=\"en\" class=\"wpml-ls-link\" aria-label=\"Cambiar a Ingl\u00e9s\" title=\"Cambiar a Ingl\u00e9s\">\n\t\t\t\t\t\t\t                                    <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/en.svg\"\n            alt=\"\"\n            loading=\"lazy\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Ingl\u00e9s<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-fr\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/fr\/\" hreflang=\"fr\" lang=\"fr\" class=\"wpml-ls-link\" aria-label=\"Cambiar a Franc\u00e9s\" title=\"Cambiar a Franc\u00e9s\">\n\t\t\t\t\t\t\t                                    <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/fr.svg\"\n            alt=\"\"\n            loading=\"lazy\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Franc\u00e9s<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-nl\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/nl\/\" hreflang=\"nl\" lang=\"nl\" class=\"wpml-ls-link\" aria-label=\"Cambiar a Holand\u00e9s\" title=\"Cambiar a Holand\u00e9s\">\n\t\t\t\t\t\t\t                                    <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/nl.svg\"\n            alt=\"\"\n            loading=\"lazy\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Holand\u00e9s<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-ru wpml-ls-last-item\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/ru\/\" hreflang=\"ru\" lang=\"ru\" class=\"wpml-ls-link\" aria-label=\"Cambiar a Ruso\" title=\"Cambiar a Ruso\">\n\t\t\t\t\t\t\t                                    <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/ru.svg\"\n            alt=\"\"\n            loading=\"lazy\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Ruso<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\t\t\t<\/ul>\n\n\t\t<\/li>\n\n\t<\/ul>\n<\/div>\n\n<h1>Fuzzy matching entre tablas:<br \/>\nTableau Prep Builder vs Anatella<\/h1>\n<p>Si est\u00e1 manipulando datos con fines de an\u00e1lisis o visualizaci\u00f3n, es probable que se ya haya tenido que enfrentarse con este problema. Necesita crear una combinaci\u00f3n entre 2 bases de datos, pero las entradas del campo de referencia no son las mismas. Diferencias ortogr\u00e1ficas, terminolog\u00edas diferentes, \u2026 las razones son muchas y variadas. Me encontr\u00e9 con este problema durante la investigaci\u00f3n que estoy realizando para visualizar los flujos de migraci\u00f3n. Tuve que resolverlo utilizando una soluci\u00f3n&nbsp;<strong>ETL (Extract \u2013 Transform \u2013 Load)<\/strong>&nbsp;que gestiona el fuzzy matching. A continuaci\u00f3n le voy a explicar c\u00f3mo lo hice.<br \/>\n<a name=\"para1\"><\/a><\/p>\n<h2>Resumen<\/h2>\n<ul>\n<li><a href=\"#para1\">Introducci\u00f3n<\/a><\/li>\n<li><a href=\"#para2\">Problema<\/a><\/li>\n<li><a href=\"#para3\">Soluci\u00f3n 1 con Tableau Prep Builder (spoiler: no funciona)<\/a><\/li>\n<li><a href=\"#para4\">Soluci\u00f3n 2 con Anatella (spoiler: funciona)<\/a><\/li>\n<li><a href=\"#para5\">Conclusi\u00f3n<\/a><\/li>\n<\/ul>\n<hr class=\"wp-block-separator\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" class=\"aligncenter size-large wp-image-13405\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-1024x341.jpg\" alt=\"\" width=\"600\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-1024x341.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-600x200.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-300x100.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-768x256.jpg 768w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner.jpg 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<p><a name=\"para2\"><\/a><\/p>\n<h2>Introducci\u00f3n<\/h2>\n<p>Como parte de un proyecto personal sobre la visualizaci\u00f3n de los flujos migratorios en Europa, obtuve cifras de la Uni\u00f3n Europea (la base de datos tiene 242500 l\u00edneas). La base de datos detalla el n\u00famero de migrantes seg\u00fan su pa\u00eds de origen y su pa\u00eds de destino. As\u00ed que, por un lado, tiene unos 200 pa\u00edses de origen y, por otro, unos 30 pa\u00edses de destino. Por lo tanto, me pareci\u00f3 apropiado visualizar estos flujos a un nivel de granularidad superior: la regi\u00f3n de origen.<br \/>\n<a name=\"para3\"><\/a><br \/>\nPodr\u00eda haber hecho grupos de pa\u00edses directamente en Tableau, pero con 200 entradas resulta bastante tedioso (y no necesariamente libre de errores). Prefer\u00ed buscar una base de datos de los diferentes pa\u00edses y la regi\u00f3n \u201coficial\u201d a la que est\u00e1n adscritos. La encontr\u00e9 en el sitio web de la Organizaci\u00f3n Mundial del Comercio (World Trade Organisation).<\/p>\n<h2>Problema<\/h2>\n<p>El problema es que el nombre de un pa\u00eds no es exactamente una constante. He aqu\u00ed algunos ejemplos:<\/p>\n<ul>\n<li>\u201cCabo Verde\u201d en la lengua nacional del pa\u00eds, \u201cCap Verde\u201d en ingl\u00e9s.<\/li>\n<li>\u201cAntigua and Barbuda\u201d en un archivo, \u201cAntigua &amp; Brabuba\u201d en el otro.<\/li>\n<li>\u201cBahamas\u201d y \u201cLas Bahamas\u201d.<\/li>\n<li>\u201cCentral African Republic\u201d y \u201cCentral African Rep.\u201d<\/li>\n<li>\u201cCook Islands (NZ)\u201d y \u201cCook Islands\u201d.<\/li>\n<li>\u201cIvory Coast\u201d y \u201cCote d\u2019Ivoire\u201d<\/li>\n<\/ul>\n<p>Antes de que los fan\u00e1ticos de \u201cbuscar y reemplazar\u201d en Excel me acusaran, busqu\u00e9 una soluci\u00f3n que fuera m\u00e1s econ\u00f3mica en t\u00e9rminos de transformaciones.<\/p>\n<p>En definitiva, como habr\u00e1s comprendido, podr\u00eda haber dedicado unas cuantas horas a limpiar mi base de datos y a hacer que las entradas fueran \u201crevisadas\u201d para que la uni\u00f3n pudiera funcionar. Pero necesitaba una soluci\u00f3n m\u00e1s elegante.<\/p>\n<hr class=\"wp-block-separator\">\n<figure class=\"aligncenter\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-13408\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/1-banner-470x157-1.jpg\" alt=\"\" width=\"470\" height=\"157\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/1-banner-470x157-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/1-banner-470x157-1-300x100.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/figure>\n<h2>Soluci\u00f3n n\u00b01 (la que no funcion\u00f3)<\/h2>\n<p>Como mi objetivo era visualizar mis datos en Tableau, la primera soluci\u00f3n que prob\u00e9 fue utilizar Tableau Prep Builder. Su ventaja es que el proceso ETL es gr\u00e1fico y los problemas son evidentes (v\u00e9ase m\u00e1s abajo, Tableau Prep los marca autom\u00e1ticamente en rojo). He resaltado en amarillo los que comentaba m\u00e1s arriba. Quedaba por ver si era posible realizar un fuzzy join entre las tablas.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14563\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1.jpg\" alt=\"\" width=\"1024\" height=\"625\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1-600x366.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1-300x183.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1-768x469.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>Investigando un poco m\u00e1s, encontr\u00e9&nbsp;<a href=\"https:\/\/docs.google.com\/document\/d\/1_WZysuqTuAIs7_NNX-F2xvthXw7DBGOZ\/edit#\" target=\"_blank\" rel=\"noopener noreferrer\">este art\u00edculo<\/a>&nbsp;que describe un m\u00e9todo de agrupaci\u00f3n por pronunciaci\u00f3n.&nbsp; Esta opci\u00f3n est\u00e1 disponible aqu\u00ed:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14560\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1.jpg\" alt=\"\" width=\"470\" height=\"277\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1-300x177.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/a><\/figure>\n<\/div>\n<p>Las agrupaciones son \u00fatiles dentro de la misma tabla para detectar variaciones. Las explicaciones t\u00e9cnicas est\u00e1n&nbsp;<a href=\"https:\/\/www.tableau.com\/engineering\/blog\/2019\/9\/automated-grouping-tableau-prep-builder\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>. El algoritmo utilizado se llama Metaphor 3 (open source, ver&nbsp;<a href=\"https:\/\/stackoverflow.com\/questions\/10442633\/what-is-the-metaphone-3-algorithm\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>).<br \/>\n<a name=\"para4\"><\/a><br \/>\nLa preocupaci\u00f3n es que las agrupaciones s\u00f3lo son posibles en una sola tabla. Deber\u00eda haber hecho una combinaci\u00f3n, luego una agrupaci\u00f3n y finalmente una deduplicaci\u00f3n manual. Este proceso es posible cuando se tienen pocas entradas, pero el m\u00e9todo no habr\u00eda sido ampliable.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/grouping-pronunciation-tableau-prep-470x316-1.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14557\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/grouping-pronunciation-tableau-prep-470x316-1.gif\" alt=\"\" width=\"470\" height=\"316\"><\/a><\/figure>\n<\/div>\n<p>Ha llegado el momento de hablar de la segunda soluci\u00f3n.<\/p>\n<hr class=\"wp-block-separator\">\n<h2><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-13411\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/2-banner-470x157-1.jpg\" alt=\"\" width=\"470\" height=\"157\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/2-banner-470x157-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/2-banner-470x157-1-300x100.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/h2>\n<h2>Soluci\u00f3n n\u00b02 (\u00a1\u00e9sta ha funcionado!)<\/h2>\n<p>Para resolver mis problemas de fuzzy matching y obtener una soluci\u00f3n escalable, recurr\u00ed entonces a&nbsp;<a href=\"http:\/\/www.anatella.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Anatella<\/a>.<\/p>\n<p>La ventaja de esta soluci\u00f3n (adem\u00e1s de ser gratuita para las configuraciones peque\u00f1as) es que tiene una herramienta de combinaci\u00f3n acoplada al fuzzy matching. Si sabe utilizar Tableau Prep (o cualquier otro ETL), no deber\u00eda tener ning\u00fan problema. El aspecto es pr\u00e1cticamente igual (cajas, flechas, par\u00e1metros). Para m\u00ed, la ventaja significativa de Anatella es la gran oferta de las funciones propuestas (+\/-300). Este es el aspecto de la configuraci\u00f3n para resolver el problema (haz clic para ampliar la imagen).<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-14554\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-1024x219.jpg\" alt=\"\" width=\"1024\" height=\"219\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-1024x219.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-600x128.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-300x64.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-768x164.jpg 768w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-1536x329.jpg 1536w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella.jpg 1873w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>No voy a detallar todo el proceso, sino que me centrar\u00e9 en las partes esenciales y, por supuesto, en el fuzzy matching.<\/p>\n<ul>\n<li>En el paso 1, separo las entradas para las que ha funcionado la combinaci\u00f3n (lower arm) de las entradas para las que no se ha encontrado ninguna coincidencia (upper arm).<\/li>\n<li>En el paso 2, aplico el famos fuzzy matching.<\/li>\n<\/ul>\n<p><a name=\"para5\"><\/a><br \/>\nEsta funci\u00f3n es emocionante porque permite ir mucho m\u00e1s all\u00e1 que Tableau Prep, por ejemplo, pero tambi\u00e9n de un ETL como Talend. En efecto, se puede elegir el algoritmo a aplicar para calcular la similitud entre dos campos. Como Anatella devuelve el&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/String_metric\" target=\"_blank\" rel=\"noopener noreferrer\">coeficiente de similitud<\/a>, es suficiente elegir un umbral y utilizarlo. Los diferentes algoritmos disponibles son el&nbsp;<a href=\"https:\/\/es.wikipedia.org\/wiki\/Coeficiente_de_Sorensen-Dice\" target=\"_blank\" rel=\"noopener noreferrer\">coeficiente de similitud de Dice<\/a>, el m\u00e9todo de similitud de Damereau LevenStein, el m\u00e9todo de similitud de&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Jaro%E2%80%93Winkler_distance\" target=\"_blank\" rel=\"noopener noreferrer\">Jareau Winkler<\/a>&nbsp;y el c\u00e1lculo de d<a href=\"https:\/\/en.wikipedia.org\/wiki\/Damerau%E2%80%93Levenshtein_distance\" target=\"_blank\" rel=\"noopener noreferrer\">istancia de Damereau Levenstein<\/a>. Se dedicar\u00e1 otro art\u00edculo a la comparaci\u00f3n de estos diferentes m\u00e9todos.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-joint-anatella.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14551\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-joint-anatella.gif\" alt=\"\" width=\"580\" height=\"335\"><\/a><\/figure>\n<\/div>\n<p>Otra ventaja de Anatella es la velocidad. El proceso completo se ejecuta en 14,84 segundos (incluyendo el fuzzy matching). La parte de la combinaci\u00f3n (hasta el paso 1) se ejecuta en 1,58 segundos, mientras que Tableau Prep Builder tarda 10 segundos.<\/p>\n<hr class=\"wp-block-separator\">\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14500\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/conclusion-banner-470x116-1.jpg\" alt=\"\" width=\"470\" height=\"116\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/conclusion-banner-470x116-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/conclusion-banner-470x116-1-300x74.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Para concluir, digamos que, en mi caso de estudio (combinaci\u00f3n de 2 tablas con Fuzzy Matching), la comparaci\u00f3n de los 2 ETLs result\u00f3 ventajosa para Anatella. Por desgracia, la funci\u00f3n de agrupaci\u00f3n fon\u00e9tica que ofrece Tableau Prep Builder no est\u00e1 adaptada a la creaci\u00f3n de una combinaci\u00f3n. S\u00f3lo puede aplicarse a una \u00fanica tabla y entonces requiere operaciones de filtrado manuales, lo que no es escalable.<\/p>\n<p style=\"margin-top: 30px;\">Fuente: <a href=\"https:\/\/www.intotheminds.com\/blog\/es\/fuzzy-matching-entre-tablas-2-etl-comparados-tableau-prep-builder-vs-anatella\/\" target=\"_blank\" rel=\"noopener\">IntoTheMind<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"C\u00f3mo hacer un join entre 2 bases de datos cuando las entradas en el campo de referencia no son exactamente las mismas.","protected":false},"author":1,"featured_media":13256,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[443,251],"tags":[444,441,439,445],"_links":{"self":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts\/14578"}],"collection":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/comments?post=14578"}],"version-history":[{"count":8,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts\/14578\/revisions"}],"predecessor-version":[{"id":15432,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts\/14578\/revisions\/15432"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/media\/13256"}],"wp:attachment":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/media?parent=14578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/categories?post=14578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/tags?post=14578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}