{"id":4326,"date":"2026-05-31T13:41:26","date_gmt":"2026-05-31T10:41:26","guid":{"rendered":"https:\/\/webanalyst.ro\/?p=4326"},"modified":"2026-05-31T17:40:18","modified_gmt":"2026-05-31T14:40:18","slug":"user-defined-functions-in-bigquery","status":"publish","type":"post","link":"https:\/\/webanalyst.ro\/blog\/2026\/user-defined-functions-in-bigquery\/","title":{"rendered":"User-Defined Functions \u00een BigQuery"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Google BigQuery a anun\u021bat \u00een urm\u0103 cu c\u00e2teva zile extinderea func\u021biilor definite de utilizator <strong>(User-Defined Functions &#8211; UDFs<\/strong>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dac\u0103 ai lucrat cu datele din Google Analytics 4 \u00een BigQuery, probabil c\u0103 ai scris de foarte multe ori comanda <code>UNNEST<\/code>. Acest lucru se poate schimba datorit\u0103 <em>user-defined functions<\/em>. Tot prin UDFs putem cur\u0103\u021ba URL-urile din GA4, precum \u0219i modifica Channel Grouping, calcula sesiunile active sau a duratei reale a sesiunii.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cen caz c\u0103 sun\u0103 cunoscut, anul trecut am scris \u0219i despre apari\u021bia <a href=\"https:\/\/webanalyst.ro\/blog\/2025\/microsoft-dax-user-defined-functions\/\" target=\"_blank\" rel=\"noreferrer noopener\">UDFs \u00een limbajul DAX pentru Microsoft PowerBI<\/a>, Excel \u0219i SSAS. Revenind la GoogleBigQuery, acesta a anun\u021bat c\u0103 le suport\u0103 \u00eenc\u0103 din <strong>august 2015<\/strong>, dar atunci puteau fi scrise doar \u00een <strong>JavaScript<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Din 2016, BigQuery a permis scrierea acestora direct \u00een <strong>SQL<\/strong> (se pot crea prin comanda <code>CREATE FUNCTION<\/code>). \u00cen anul 2020 au lansat <strong>Authorized UDFs<\/strong>, care permite unui analist s\u0103 creeze o func\u021bie care interogheaz\u0103 o tabel\u0103 securizat\u0103, la care el poate s\u0103 nu aib\u0103 acces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Revenind la \u0219tirile din aceast\u0103 lun\u0103, Google a anun\u021bat <strong>suport nativ pentru Python \u00een UDFs<\/strong> \u0219i c\u00e2teva optimiz\u0103ri masive de infrastructur\u0103 la conferin\u021ba Google Cloud Next din aprilie 2026 \u0219i \u00een actualiz\u0103rile anun\u021bate oficial la finalul lunii mai 2026, pe care le voi detalia \u00een continuare.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Lansarea Python UDFs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cea mai mare actualizare adus\u0103 la func\u021biile definite de utilziator din BigQuery este posibilitatea de a scrie <strong>UDF-uri direct \u00een Python<\/strong>, rul\u00e2nd codul \u00eentr-un mediu securizat tip container. Utilizatorii nu mai sunt limita\u021bi la SQL \u0219i JavaScript dac\u0103 vor s\u0103 \u00ee\u0219i defineasc\u0103 propriile func\u021bii \u00een BigQuery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Astfel, utilziatorii pot importa pachete populare de Data Science \u0219i analiz\u0103 precum <code>pandas<\/code>, <code>numpy<\/code>, <code>scipy<\/code> sau <code>scikit-learn<\/code> direct \u00een func\u021bie, folosind op\u021biunea <code>packages<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">UDF-uri Vectorizate cu Apache Arrow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Odat\u0103 cu introducerea Python-ului, o mare problem\u0103 era viteza de procesare (<em>overhead<\/em>-ul creat prin trimiterea r\u00e2nd cu r\u00e2nd a datelor c\u0103tre containerul de Python).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Google a rezolvat asta \u00een mai 2026 prin lansarea <strong>UDF-urilor Vectorizate<\/strong>, care folosesc interfa\u021ba <code>Apache Arrow RecordBatch<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Astfel, \u00een loc ca BigQuery s\u0103 trimit\u0103 datele linie cu linie c\u0103tre func\u021bia ta, le trimite \u00een <strong>pachete masive (<em>batches<\/em>)<\/strong> direct sub form\u0103 de <code>pandas.DataFrame<\/code>.<br>Rezultatul este o performan\u021b\u0103 de zeci de ori mai rapid\u0103 pentru calcule matematice complexe, simul\u0103ri financiare sau transform\u0103ri masive de text.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Monitorizare prin Cloud Monitoring \u0219i Controlul Concuren\u021bei<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pentru inginerii de date care ruleaz\u0103 mii de astfel de func\u021bii la nivelul enterprise, Google a ad\u0103ugat func\u021bionalit\u0103\u021bi esen\u021biale de DevOps pentru UDF-uri:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Integrare cu Cloud Monitoring<\/strong> &#8211; UDF-urile export\u0103 acum automat metrici opera\u021bionale. Utilizatorii pot vedea exact c\u00e2t CPU \u0219i c\u00e2t\u0103 memorie (RAM) consum\u0103 func\u021biile customizate;<\/li>\n\n\n\n<li><strong>Concurrency Control<\/strong> &#8211; a fost introdus parametrul <code>container_request_concurrency<\/code> \u00een statement-ul <code>CREATE FUNCTION<\/code>. Acesta permite limitarea num\u0103rului de cereri simultane pe care le poate procesa o singur\u0103 instan\u021b\u0103 de container, oferindu-\u021bi un control strict asupra resurselor pentru a evita erorile de tip <em>Out of Memory<\/em>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Ultimul tren pentru UDF-urile din <em>Legacy SQL<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tot \u00een mai 2026, Google a emis o avertizare final\u0103 privind <strong>Legacy SQL<\/strong>. \u00cencep\u00e2nd cu 1 iunie 2026, accesul la vechiul dialect <em>Legacy SQL<\/em> (\u0219i implicit la UDF-urile scrise \u00een formatul vechi din 2015) va fi complet blocat pentru proiectele care nu le-au mai folosit \u00een ultimele luni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Google for\u021beaz\u0103 astfel migrarea complet\u0103 c\u0103tre <strong>Standard SQL<\/strong> (<strong>GoogleSQL<\/strong>) pentru o securitate \u0219i performan\u021b\u0103 sporit\u0103. Pe scurt, dac\u0103 \u00eenainte UDF-urile din BigQuery erau doar pentru mici scripturi de cur\u0103\u021bat text \u00een JavaScript, update-ul din mai 2026 le-a transformat \u00een <strong>instrumente veritabile de Data Science \u0219i Machine Learning \u00een-situ<\/strong>, elimin\u00e2nd nevoia de a mai exporta datele din BigQuery \u00een notebook-uri externe pentru calcule complexe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">BigQuery a anun\u021bat c\u00e2teva func\u021bionalit\u0103\u021bi majore privind <strong>user-defined functions<\/strong> \u0219i sunt tare curios cum vor fi acestea utilizate de c\u0103tre utilizatori.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Google BigQuery a anun\u021bat \u00een urm\u0103 cu c\u00e2teva zile extinderea func\u021biilor definite de utilizator (User-Defined Functions &#8211; UDFs). Dac\u0103 ai lucrat cu datele din Google Analytics 4 \u00een BigQuery, probabil c\u0103 ai scris de foarte multe ori comanda UNNEST. Acest lucru se poate schimba datorit\u0103 user-defined functions. Tot prin UDFs putem cur\u0103\u021ba URL-urile din GA4, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4327,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,11,12],"tags":[540,925,943],"class_list":["post-4326","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","category-noutati","category-technical","tag-bigquery","tag-ga4","tag-google-cloud"],"_links":{"self":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/4326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/comments?post=4326"}],"version-history":[{"count":2,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/4326\/revisions"}],"predecessor-version":[{"id":4330,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/4326\/revisions\/4330"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/media\/4327"}],"wp:attachment":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/media?parent=4326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/categories?post=4326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/tags?post=4326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}