Snowpark for Python نام ادغام عملکرد جدید پایتون است که Snowflake اخیراً توسعه داده است.
در اجلاس Snowflake Summit در ژوئن 2022، Snowpark برای Python به طور رسمی در پیش نمایش عمومی منتشر شد، به این معنی که هر کسی می تواند استفاده از Python را در محیط Snowflake خودش شروع کند.
اگر میخواهید این مقاله را نادیده بگیرید و مستقیماً به بخش مستندات یکپارچه Snowflake بروید درک میکنم، با این حال اکیداً توصیه میکنم ابتدا این مقاله را بخوانید زیرا به شما امکانها و محدودیتهای این عملکرد جدید را معرفی میکند.
همچنین مراحلی را که می توانید برای ایجاد تابع تعریف شده توسط کاربر پایتون یا به اختصار Python UDF خود از داخل Snowflake انجام دهید، طی خواهیم کرد. برای این کار نیازی به راهاندازی چیزی در سرور محلی شحصی نیست، تنها چیزی که نیاز دارید یک حساب Snowflake و امتیازات مربوطه است، به ویژه امتیاز CREATE FUNCTION.
اگر میخواهید در مورد رویههای ذخیره شده پایتون به جای UDF اطلاعاتی کسب کنید، حتماً «راهنمای قطعی ایجاد رویههای ذخیره شده پایتون بهطور مستقیم با رابط کاربری Snowflake» را بررسی کنید.
چرا از Python UDF به جای SQL UDF استفاده کنیم؟
اکثر کاربران Snowflake با SQL بسیار راحت تر از Python یا سایر زبان های برنامه نویسی پیشرفته هستند، زیرا SQL زبان اصلی مورد نیاز برای استفاده از پلتفرم Snowflake است. با در نظر گرفتن این موضوع، استفاده از UDF های مبتنی بر SQL به جای زبان های دیگر مانند پایتون آسان است. با این حال، چندین دلیل قوی برای استفاده از یک زبان غیر SQL به جای آن وجود دارد، به خصوص در مقایسه با پایتون:
- پایتون یک زبان سطح بالا است که می تواند بسیار بیشتر از SQL استاندارد باشد، از جمله توانایی وارد کردن و استفاده از قابلیت ها از تعداد زیادی ماژول.
- UDF های SQL فقط می توانند از یک دستور SQL استفاده کنند. این در مستندات Snowflake به شرح زیر بیان شده است:
به طور خلاصه، پایتون به سادگی تطبیق پذیرتر از SQL است و طیف وسیع تری از عملکردها را باز می کند. در اینجا چند نمونه از عملکرد قدرتمندی وجود دارد که با پایتون و نه با SQL امکان پذیر است:
- به جای محدود کردن به یک دستور SQL، چندین دستور را زنجیره بزنید
- به فایلهای پشتیبان در فضای ذخیرهسازی ابری دسترسی داشته باشید و محتویات آنها را بخوانید تا به اسکریپت کلی پایتون کمک کنید
- با استفاده از پاندا Pandas ، تبدیل داده های قدرتمندی را که از اجزای متعدد ساخته شده است، انجام دهید
- از تابع ()map یا لیست comprehension برای اعمال یک تابع به هر مقدار از یک لیست استفاده کنید. یک راه ساده برای پشتیبانی از حلقه و تکرار
- از مدل های یادگیری ماشین برای ایجاد پیش بینی های جدید با استفاده از کتابخانه هایی مانند PyTorch یا scikit-learn استفاده کنید.
چرا از UDF پایتون استفاده نمی کنید؟
UDF های پایتون هیچ راهی برای تعامل مستقیم با اشیاء Snowflake ندارند. به عبارت دیگر، یک UDF پایتون قادر به اجرای دستور SQL نیست. این به این دلیل است که UDF ها به “جهان بیرون” دسترسی ندارند و یک شی Snowflake Snowpark Session برای تعامل با Snowflake با استفاده از Python مورد نیاز است. برخلاف رویههای ذخیرهشده، یک UDF بهعنوان آرگومان از جلسه Snowflake Snowpark ارسال نمیشود و بنابراین نمیتواند اشیاء Snowflake را پرس و جو کند.
هشدار در مورد فایل ها و کتابخانه های مرحله بندی شده
همانطور که در بالا ذکر شد، توجه به این نکته مهم است که UDF ها به “جهان بیرون” دسترسی ندارند. این یک محدودیت امنیتی است که توسط Snowflake عمدا اعمال شده است. اگر میخواهید یک UDF ایجاد کنید که به دنیای خارج دسترسی داشته باشد، به عنوان مثال: برای ساخت یک API با استفاده از کتابخانه درخواستها، توصیه میشود به جای آن از external functions استفاده کنید.
چگونه UDF پایتون خود را از یک Snowflake Worksheet ایجاد کنید
Snowflake اکنون توانایی ایجاد UDF های پایتون را مستقیماً در دستورات استانداردی که می تواند از داخل یک Snowflake Worksheet اجرا شود ادغام کرده است. چه از رابط کاربری کلاسیک یا از رابط کاربری جدید Snowsight استفاده کنید، میتوانید به سادگی یک ورک شیت را باز کنید و از این الگوی کد برای شروع استفاده کنید.
- این الگو شامل خطی در مورد بسته های اختیاری است که پس از مثال های ساده ما مورد بحث قرار خواهد گرفت.
عناصر اصلی برای درک در اینجا عبارتند از:
- همه چیز در مجموعه $$s در خطوط 9 و 15 باید کد پایتون باشد و خود تابع را تشکیل می دهد. در همین حال، همه چیز خارج از آن $$s طعم SQL Snowflake است و حاوی ابرداده برای تابع است.
- در ردیف 7، آنچه را که به عنوان handler شناخته می شود، تعریف می کنیم. این نام تابع اصلی در کد پایتون ما است که Snowflake UDF آن را اجرا خواهد کرد. این کنترل کننده باید با یک تابع در کد پایتون مطابقت داشته باشد وگرنه UDF از کار می افتد.
- در ردیف 2، نوع داده ای را که UDF برمی گرداند، تعریف می کنیم. من قصد دارم این موضوع را از طریق مثال های ساده زیر توضیح دهم.
در ردیف های 5 و 6 خطوطی در مورد بسته های اختیاری و واردات برای تابع وجود دارد. این بعد از مثال های ساده ما مورد بحث قرار خواهد گرفت. - آرگومان های ارسال شده به UDF در ردیف 1 همان آرگومان هایی هستند که به تابع handler در پایتون در ردیف 10 ارسال می شوند. با این حال، ممکن است نیاز باشد که انواع دادهها از طعم SQL Snowflake به معادلهای Python تغییر یابد. در یادداشت زیر بیشتر به این موضوع پرداخته شده است.
یادداشتی در مورد UDF و آرگومان های تابع
نکته مهمی که هنگام ایجاد UDF پایتون باید در نظر داشت انواع داده های مجاز است.
هنگام تعریف فراداده UDF خود، همه انواع داده ها از منظر طعم Snowflake از SQL مشاهده می شوند. به طور خاص، من به آرگومان های خط 1 و نوع داده بازگشتی در خط 2 اشاره می کنم.
هنگام تعریف متغیرها در کد پایتون، هر آرگومان ورودی در تابع handler (خط 10) یا مقادیر برگشتی (ردیف 14) باید یکی از انواع داده های مشخص شده در ستون نوع داده پایتون جدول SQL-Python Type Mappings table باشد.
همچنین مهم است که توجه داشته باشید که تعداد آرگومان های ارسال شده به UDF در ردیف 1 همان تعداد آرگومان های ارسال شده به تابع پایتون در ردیف 10 است و باید به همان ترتیب مورد نظر باشد. اگرچه من توصیه میکنم برای سهولت درک، متغیرها را به طور مشابه نامگذاری کنید، اما تا زمانی که نام این متغیرها به ترتیب یکسان هستند و از انواع دادههای مشابه استفاده میکنند، نیازی به تراز کردن دقیق ندارند.
مثال های ساده
بیایید این را تجزیه کنیم و چند مثال ساده برای توضیح واضح تر آنچه اتفاق می افتد ارائه دهیم.
لطفاً توجه داشته باشید که این نمونه ها عمداً در طراحی خود حداقلی هستند و بنابراین شامل هیچ گونه رسیدگی به خطا یا مفاهیم مشابه نیستند. بهترین شیوهها آمادهسازی توابع با قابلیت مدیریت خطا برای جلوگیری از اجرای غیرضروری و ارائه خروجیهای خطای مفید برای کاربر نهایی است.
عدد صحیح ورودی را در سه ضرب کنید
برای تغییر این متن بر روی دکمه ویرایش کلیک کنید. لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است.
برای تأیید درک ما، چند چیز وجود دارد که باید در اینجا توضیح دهیم:
- در ردیف های 8 و 9، ما یک تابع بسیار ساده در پایتون تعریف کرده ایم که یک عدد ورودی را در سه ضرب می کند.
- نام تابع handler ما در ردیف 5 با تابع Python تعریف شده در ردیف 8 مطابقت دارد.
- در ردیف 2، می بینیم که تابع ما یک عدد صحیح برمی گرداند و عدد صحیح NULL نخواهد بود.
- آرگومان INPUT_INT که به UDF در ردیف 1 ارسال می شود، عدد صحیحی است که هنگام اجرای تابع handler در پایتون در ردیف 8 به آرگومان input_int_py ارسال می شود.
اگر این کد را در یک کاربرگ Snowflake اجرا کنیم، میتوانیم تابع را به همان روشی که هر تابع دیگری را فراخوانی میکنیم تا نتیجه را ببینیم.
دو عدد صحیح ورودی را با هم ضرب کنید
مثال دوم ما یک تابع ساده دیگر است که این بار دو عدد صحیح ورودی را می گیرد و آنها را با هم ضرب می کند. بیایید کد را ببینیم:
شباهت های زیادی بین این و عملکرد قبلی ما وجود دارد. با این حال، این بار، ما ورودی های متعددی داریم.
دوباره، اگر این کد را در یک کاربرگ Snowflake اجرا کنیم، میتوانیم تابع را به همان روشی که هر تابع دیگری را برای دیدن نتیجه فراخوانی میکنیم، فراخوانی کنیم.
همه اعداد صحیح در یک آرایه ورودی را در یک عدد صحیح دیگر ضرب کنید
آخرین مثال ساده ما همه چیز را یک قدم جلوتر می برد، به طوری که می توانیم یک تابع پایتون اضافی را در اسکریپت خود معرفی کنیم و قدرت درک لیست را نشان دهیم. این UDF آرایه ای از اعداد صحیح را به عنوان ورودی به همراه ورودی دوم از یک عدد صحیح می پذیرد. تابع تمام اعضای آرایه را در آن عدد صحیح دوم ضرب می کند.
بیایید کد را ببینیم:
در اینجا چند نکته قابل توجه است:
- در ردیف 5، میتوانیم ببینیم که اکنون بهجای عدد صحیح، منتظر یک آرایه به عنوان خروجی هستیم.
- در ردیف های 12-17، ما در حال تعریف تابع دوم پایتون در اسکریپت خود هستیم. این تابع multiply_together_py نامیده می شود. این به شدت مورد نیاز نیست زیرا می توانیم از یک تابع لامبدا استفاده کنیم. با این حال، من آن را برای نشان دادن عملکرد گنجانده ام.
- در ردیف 27، ما از مفهوم درک لیست برای اعمال تابع multiply_together_py خود به هر عضو آرایه ورودی خود استفاده می کنیم.
دوباره، اگر این کد را در یک ورک شیت Snowflake اجرا کنیم، میتوانیم تابع را به همان روشی که هر تابع دیگری را برای دیدن نتیجه فراخوانی میکنیم، فراخوانی کنیم.
واردات کتابخانه های اضافی از آناکوندا
حتی اگر نمونههای ما تا کنون همه نسبتاً ابتدایی بودهاند، میتوانیم از قبل ببینیم UDFهای پایتون چقدر میتوانند قدرتمند باشند. ما نه تنها قادر به دریافت ورودی ها و استفاده از آنها برای تولید خروجی هستیم، بلکه می توانیم عملکرد خود را در اسکریپت پایتون تعریف کنیم و مراحل منطقی پیچیده تری را هنگام اجرای تابع خود انجام دهیم.
اگر بخواهیم از کتابخانه های پایتون که بخشی از standard inbuilt set نیستند استفاده کنیم، چه می شود؟ به عنوان مثال، اگر بخواهیم از پانداها، PyTorch یا طیف گسترده ای از کتابخانه های محبوب دیگر استفاده کنیم، چه؟ خبر خوب در اینجا این است که Snowflake با Anaconda شریک شده است، و شما در حال حاضر همه چیز مورد نیاز خود را برای استفاده از هر یک از کتابخانه های فهرست شده در Anaconda’s Snowflake channel دارید.
اگر میخواهید از کتابخانههایی استفاده کنید که در کانال آناکوندا Snowflake گنجانده نشدهاند، از جمله کتابخانههایی که در داخل خود ایجاد کردهاید، باید آنها را جداگانه وارد کنید. این در قسمت بعد مورد بحث قرار خواهد گرفت.
پذیرش شرایط استفاده برای فعال کردن بسته های شخص ثالث
برای استفاده از بسته های شخص ثالث از Anaconda در Snowflake، یک ORGADMIN باید ابتدا شرایط استفاده شخص ثالث را بپذیرد. من در حال حاضر از طریق این فرآیند گام بر می دارم. با این حال، جزئیات بیشتر را می توان در اینجا برای کسانی که مایل به آن هستند پیدا کرد. این مرحله فقط باید یک بار برای کل سازمان تکمیل شود.
1- با استفاده از نقش ORGADMIN در رابط کاربری SnowSight، برای پذیرش شرایط استفاده شخص ثالث، به «Admin» > «Billing» بروید.
2 – تایید
3- سپس صفحه به روز می شود تا شرایط پذیرفته شده را منعکس کند
نمونه هایی با استفاده از کتابخانه های شخص ثالث پشتیبانی شده
اکنون که کتابخانههای شخص ثالث را برای سازمان خود فعال کردهایم، میتوانیم نمونههای جالبتری را نشان دهیم.
یک نام تصادفی ایجاد کنید
این تابع کتابخانه جعلی را برای تولید داده های جعلی وارد می کند. این یک ابزار مفید برای ایجاد مجموعه داده های ساختگی است. بیایید کد را ببینیم:
تفاوت اصلی بین این UDF و نمونه های قبلی ما عبارتند از:
- در ردیف 5، اکنون خطی برای گنجاندن کتابخانه جعلی در فراداده UDF قرار داده ایم.
- در ردیف 11، ما از عملکرد استاندارد پایتون برای وارد کردن ابزارهای مورد نیاز از کتابخانه جعلی استفاده می کنیم، که سپس در تابع پایتون ما استفاده می شود.
دوباره، اگر این کد را در یک کاربرگ Snowflake اجرا کنیم، میتوانیم تابع را به همان روشی که هر تابع دیگری را برای دیدن نتیجه فراخوانی میکنیم، فراخوانی کنیم.
یک جفت Snowflake-Compliant Key ایجاد کنید.
این تابع کتابخانه رمزنگاری را برای ایجاد یک جفت کلید احراز هویت که با Snowflake سازگار است وارد می کند. من مزایای این را در وبلاگ قبلی مورد بحث قرار داده ام. با این حال، این قابلیت جدید پایتون، جنبه فنی این وبلاگ را افزایش می دهد.
توجه به این نکته مهم است که این رویکرد خاص بهترین روش نیست زیرا کاربران ناخواسته ممکن است بتوانند به کلید خصوصی از تاریخچه Snowflake دسترسی پیدا کنند. با این حال، من این را در یک پست وبلاگ آینده حل خواهم کرد.
بیایید کد را ببینیم:
مشابه آخرین مثال ما، تفاوت اصلی بین این UDF و نمونه های اصلی ما عبارتند از:
- در ردیف 5، اکنون خطی برای گنجاندن کتابخانه رمزنگاری در فراداده UDF قرار داده ایم.
- در ردیفهای 11 و 12، ما از عملکرد استاندارد پایتون برای وارد کردن ابزارهای مورد نیاز از کتابخانه رمزنگاری استفاده میکنیم که سپس در تابع پایتون ما استفاده میشوند.
دوباره، اگر این کد را در یک کاربرگ Snowflake اجرا کنیم، میتوانیم تابع را به همان روشی که هر تابع دیگری را برای دیدن نتیجه فراخوانی میکنیم، فراخوانی کنیم.
وارد کردن فایل ها و کتابخانه ها از طریق یک مرحله
تا کنون، ما در دوره تصادف مینیاتوری خود در UDF های پایتون در Snowflake بسیار چیزهای زیادی را نشان داده ایم. قبل از پایان، میخواهم آخرین قسمت را پوشش دهم، که نحوه وارد کردن کتابخانههایی است که تحت پوشش کانال Anaconda Snowflake نیستند و نحوه وارد کردن فایلهای خارجی دیگر.
هشدار در مورد فایل ها و کتابخانه های مرحله بندی شده
در حال حاضر توجه به این نکته مهم است که این فایل های خارجی به موقع رفع می شوند. UDF ها به «دنیای بیرون» دسترسی ندارند و هر فایل باید در همان مرحله در زمان ایجاد UDF وجود داشته باشد زیرا فایل در واقع در محل ذخیره سازی زیرین Snowflake برای UDF کپی می شود. اگر فایل های خود را در مرحله خارجی خود به روز کنید، Snowflake UDF شما دچار این تغییرات نمی شود مگر اینکه UDF را نیز بازسازی کنید.
متأسفانه، فایل ها باید به صورت جداگانه و اختصاصی به UDF ها وارد شوند. اگر می خواهید پنج فایل را در یک دایرکتوری وارد کنید، باید هر پنج فایل را به صورت جداگانه فهرست کنید. شما نمی توانید به سادگی یک دایرکتوری والد را مشخص کنید یا از یک علامت عام استفاده کنید.
مثال هایی با استفاده از فایل ها و کتابخانه های خارجی
برای این مثالها، ما همه فایلهای مورد نیاز خود را در مرحله «STG_FILES_FOR_UDFS» آپلود میکنیم.
Import an External Excel xlsx File
این مثال یک فایل اکسل xlsx را در یک دیتافریم pandas می خواند، سپس از اطلاعات موجود در آن فایل برای نگاشت رشته ورودی به خروجی مربوطه استفاده می کند.
فایلی که ما از آن استفاده خواهیم کرد یک فایل نقشه برداری بسیار ساده است که به شکل زیر است:
فایل “Dummy Mapping File.xlsx” نام دارد و من آن را در مرحله “STG_FILES_FOR_UDFS” آپلود کرده ام.
در اینجا کد مربوط به خود UDF است:
تفاوت های منحصر به فرد برای این مثال عبارتند از:
- ردیف 6 شامل یک خط برای وارد کردن فایل از یک مرحله است. این یک مؤلفه حیاتی برای تابع پایتون ما است تا بتواند در طول تابع pandas.from_excel () به فایل دسترسی پیدا کند.
- انعکاس این کد در خطوط 16 و 17 است که از کتابخانه sys برای دسترسی به مکانی استفاده می کند که Snowflake فایل هایی را که به UDF وارد شده اند ذخیره می کند.
بقیه کدهای موجود در این اسکریپت، کدهای اختصاصی پایتون هستند تا فایل اکسل را در یک دیتافریم دانلود کرده، آن را به آیتم خاص ما فیلتر کرده و مقدار گروه منطبق را برگرداند.
دوباره، اگر این کد را در یک کاربرگ Snowflake اجرا کنیم، میتوانیم تابع را به همان روشی که هر تابع دیگری را برای دیدن نتیجه فراخوانی میکنیم، فراخوانی کنیم.
یک کتابخانه خارجی غیر استاندارد وارد کنید
این مثال برای استفاده از تابع xldate کتابخانه xlrd طراحی شده است. این کتابخانه در مجموعه استاندارد کتابخانه های پشتیبانی شده گنجانده نشده است، بنابراین باید به طور خاص وارد شود.
بیایید کد را ببینیم:
تفاوت های منحصر به فرد برای این مثال عبارتند از:
- ردیف 5 شامل یک خط برای وارد کردن فایل xldate.py از یک مرحله است. این بسیار مهم است و با فایل موجود در دایرکتوری env/Lib/site-packages/xlrd شما که در حین نصب پیپ در یک محیط مجازی (یا محیط پیشفرض شما) ایجاد شده است، مطابقت دارد.
- مانند مثال قبلی، خطوط 14 و 15 از کتابخانه sys برای دسترسی به مکانی که Snowflake فایل های وارد شده به UDF را ذخیره می کند، استفاده می کند.
- بلوک خطوط 18-21 از کتابخانه importlib.util برای وارد کردن ماژول خاص از دایرکتوری وارد شده استفاده می کند.
دوباره، اگر این کد را در یک کاربرگ Snowflake اجرا کنیم، میتوانیم تابع را به همان روشی که هر تابع دیگری را برای دیدن نتیجه فراخوانی میکنیم، فراخوانی کنیم.
جمع بندی
ما مطالب زیادی را در این پست پوشش دادهایم، و برخی از این UDF ها به طور بالقوه میتوانند به تنهایی می توانند یک مقاله وبلاگ باشند! هدف من نشان دادن نحوه ایجاد UDF برای سناریوهای مختلف و ارائه آن در یک پست است تا در صورت نیاز به راحتی برای خوانندگان پیدا شود و به آنها مراجعه کنند.
امیدوارم این به شما کمک کند تا سفر خود را با UDF های پایتون در Snowflake شروع کنید. به ما اطلاع دهید که چه چیزهای جالبی را مطرح می کنید، همیشه دیدن عملکردهای جدید که منجر به نوآوری مولد و مفید می شود بسیار عالی است.
اگر میخواهید درباره رویههای ذخیره شده پایتون اطلاعاتی کسب کنید، حتماً پست آینده من، «راهنمای قطعی ایجاد رویههای ذخیرهشده پایتون بهطور مستقیم با رابط کاربری Snowflake» را مطالعه کنید.
1 دیدگاه
سلام پست خوبی بود.
لطفا قابلیت کپی کردن کدها را قرار دهید.