ProHoster > وبلاگ > اداره > یادداشت های دانشمند داده: بررسی شخصی زبان های پرس و جو داده ها
یادداشت های دانشمند داده: بررسی شخصی زبان های پرس و جو داده ها
من از تجربه شخصی به شما می گویم که چه چیزی کجا و چه زمانی مفید بوده است. این یک نمای کلی و پایان نامه است، به طوری که مشخص است چه چیزی و کجا می توانید بیشتر حفاری کنید - اما در اینجا من تجربه شخصی منحصراً ذهنی دارم، شاید همه چیز برای شما کاملاً متفاوت باشد.
چرا دانستن و توانایی استفاده از زبان های پرس و جو مهم است؟ در هسته خود، Data Science چندین مرحله مهم از کار دارد و اولین و مهمترین (بدون آن، مطمئناً هیچ چیز کار نخواهد کرد!) به دست آوردن یا استخراج داده است. اغلب، داده ها در جایی به شکلی قرار دارند و باید از آنجا "بازیابی" شوند.
زبان های پرس و جو به شما امکان می دهند همین داده ها را استخراج کنید! و امروز در مورد آن زبان های پرس و جو که برای من مفید بوده اند به شما می گویم و به شما می گویم و به شما نشان می دهم که دقیقاً کجا و چگونه - چرا برای مطالعه لازم است.
سه بلوک اصلی از انواع کوئری داده وجود دارد که در این مقاله به آنها خواهیم پرداخت:
زبانهای پرس و جو «استاندارد» همان چیزی است که معمولاً هنگام صحبت در مورد یک زبان پرس و جو، مانند جبر رابطهای یا SQL، درک میشود.
زبان های پرس و جوی اسکریپت نویسی: به عنوان مثال، پاندای چیزهای پایتون، اسکریپت نویسی numpy یا shell.
زبان های پرس و جو برای نمودارهای دانش و پایگاه داده های گراف.
همه چیزهایی که در اینجا نوشته شده است فقط یک تجربه شخصی است، آنچه مفید است، با توصیف موقعیت ها و "چرا به آن نیاز بود" - همه می توانند در مورد چگونگی موقعیت های مشابه امتحان کنند و سعی کنند با درک این زبان ها از قبل برای آنها آماده شوند. قبل از اینکه مجبور شوید (فوری) برای یک پروژه درخواست دهید یا حتی به پروژه ای که در آن مورد نیاز است برسید.
زبان های پرس و جو "استاندارد".
زبان های پرس و جو استاندارد دقیقاً به این معنا هستند که معمولاً وقتی در مورد پرس و جو صحبت می کنیم به آنها فکر می کنیم.
جبر رابطه ای
چرا امروزه به جبر رابطه ای نیاز است؟ برای اینکه درک خوبی از اینکه چرا زبانهای پرسوجو به روشی خاص ساختار یافتهاند و آگاهانه از آنها استفاده میکنند، باید هسته اصلی آنها را درک کنید.
جبر رابطه ای چیست؟
تعریف رسمی به شرح زیر است: جبر رابطه ای یک سیستم بسته از عملیات بر روی روابط در یک مدل داده رابطه ای است. به بیان کمی انسانی تر، این سیستمی از عملیات روی جداول است به طوری که نتیجه همیشه یک جدول است.
مشاهده تمام عملیات رابطه ای در این مقاله از Habr - در اینجا توضیح می دهیم که چرا باید بدانید و کجا مفید است.
چرا؟
شروع به درک اینکه زبانهای پرسوجو درباره چه چیزی هستند و چه عملیاتی در پشت عبارات در زبانهای پرس و جوی خاص وجود دارد، اغلب درک عمیقتری از آنچه در زبانهای پرس و جو و چگونه کار میکند به دست میدهد.
گرفته شده از این مقالات نمونه ای از عملیات: join که جداول را به هم می پیوندد.
مواد مورد مطالعه:
دوره مقدماتی خوب از استانفورد. به طور کلی، مطالب زیادی در مورد جبر رابطه ای و نظریه وجود دارد - Coursera، Udacity. همچنین حجم زیادی از مطالب آنلاین، از جمله مطالب خوب وجود دارد دوره های دانشگاهی. توصیه شخصی من: شما باید جبر رابطه ای را به خوبی درک کنید - این اساس اصول است.
SQL اساساً اجرای جبر رابطهای است - با یک هشدار مهم، SQL اعلامی است! یعنی، هنگام نوشتن یک پرس و جو به زبان جبر رابطه ای، در واقع می گویید چگونه محاسبه شود - اما با SQL مشخص می کنید که چه چیزی را می خواهید استخراج کنید، و سپس DBMS قبلاً عبارات (موثر) را در زبان جبر رابطه ای تولید می کند. معادل برای ما به عنوان شناخته شده است قضیه کاد).
DBMS های رابطه ای: Oracle، Postgres، SQL Server و غیره هنوز تقریباً همه جا هستند و احتمال بسیار بالایی وجود دارد که مجبور شوید با آنها تعامل داشته باشید، به این معنی که یا باید SQL را بخوانید (که بسیار محتمل است) یا آن را بنویسید ( بعید هم نیست).
چه بخوانیم و مطالعه کنیم
با توجه به لینک های بالا (در مورد جبر رابطه ای)، مقدار باورنکردنی مواد وجود دارد، به عنوان مثال، این.
به هر حال، NoSQL چیست؟
شایان ذکر است که واژه NoSQL منشأ کاملاً خودانگیخته ای دارد و هیچ تعریف یا نهاد علمی پذیرفته شده ای در پس آن وجود ندارد. متناظر مقاله در هابر
در واقع، مردم متوجه شدند که برای حل بسیاری از مسائل به یک مدل رابطهای کامل نیازی نیست، بهویژه برای کسانی که، برای مثال، عملکرد حیاتی است و پرسوجوهای ساده با تجمیع غالب هستند - جایی که محاسبه سریع معیارها و نوشتن آنها در پایگاه داده، و اکثر ویژگی ها رابطه ای هستند نه تنها غیر ضروری، بلکه مضر هستند - چرا چیزی را عادی کنیم اگر مهم ترین چیز را برای ما خراب کند (برای یک کار خاص) - بهره وری؟
همچنین، طرحوارههای انعطافپذیر اغلب بهجای طرحوارههای ریاضی ثابت مدل رابطهای کلاسیک مورد نیاز هستند - و این به طرز باورنکردنی توسعه برنامهها را در مواقعی که استقرار سیستم و شروع سریع کار، پردازش نتایج حیاتی است - یا طرحواره و انواع دادههای ذخیرهشده ساده میکند. چندان مهم نیستند
به عنوان مثال، ما در حال ایجاد یک سیستم خبره هستیم و می خواهیم اطلاعات را در یک دامنه خاص به همراه برخی اطلاعات متا ذخیره کنیم - ممکن است همه فیلدها را ندانیم و به سادگی JSON را برای هر رکورد ذخیره کنیم - این یک محیط بسیار انعطاف پذیر برای گسترش داده ها به ما می دهد. مدل و به سرعت تکرار می شود - بنابراین در این مورد، NoSQL حتی ارجح تر و قابل خواندن تر خواهد بود. ورودی مثال (از یکی از پروژه های من که در آن NoSQL درست در جایی بود که لازم بود).
در اینجا، در عوض، شما فقط باید کار خود را به طور کامل تجزیه و تحلیل کنید، چه ویژگی هایی دارد و چه سیستم های NoSQL در دسترس هستند که با این توضیحات مطابقت دارند - و سپس مطالعه این سیستم را شروع کنید.
زبان های پرس و جو اسکریپت
در ابتدا، به نظر می رسد که پایتون به طور کلی چه ربطی به آن دارد - این یک زبان برنامه نویسی است و اصلاً در مورد پرس و جو نیست.
پانداها به معنای واقعی کلمه یک چاقوی ارتش سوئیس از علم داده است؛ حجم عظیمی از تبدیل داده ها، تجمع و غیره در آن اتفاق می افتد.
Numpy - محاسبات برداری، ماتریس ها و جبر خطی وجود دارد.
Scipy - ریاضیات زیادی در این بسته وجود دارد، به خصوص آمار.
آزمایشگاه Jupyter - بسیاری از تجزیه و تحلیل داده های اکتشافی به خوبی در لپ تاپ ها قرار می گیرند - دانستن آن مفید است.
درخواست ها - کار با شبکه.
Pyspark در بین مهندسان داده بسیار محبوب است، به احتمال زیاد شما مجبور خواهید بود با این یا Spark تعامل داشته باشید، صرفاً به دلیل محبوبیت آنها.
* سلنیوم - برای جمع آوری داده ها از سایت ها و منابع بسیار مفید است، گاهی اوقات به سادگی هیچ راه دیگری برای دریافت داده وجود ندارد.
اساسا، ما می بینیم که کد در الگوی کلاسیک SQL قرار می گیرد.
SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, …..
FROM dataset
WHERE trip_type = ‘return’
GROUPBY start_station_name, end_station_name
اما بخش مهم این است که این کد بخشی از اسکریپت و خط لوله است؛ در واقع، ما در حال تعبیه کوئری ها در خط لوله پایتون هستیم. در این شرایط، زبان پرس و جو از کتابخانه هایی مانند Pandas یا pySpark به ما می رسد.
به طور کلی، در pySpark نوع مشابهی از تبدیل داده را از طریق یک زبان پرس و جو در روحیه زیر مشاهده می کنیم:
به طور کلی روی خود پایتون مشکلی نیست مطالبی برای مطالعه پیدا کنید تعداد زیادی آموزش آنلاین وجود دارد پانداها, pySpark و دوره های در جرقه (و همچنین به خودی خود DS). به طور کلی، محتوای اینجا برای گوگل کردن عالی است، و اگر مجبور باشم یک بسته را برای تمرکز روی آن انتخاب کنم، مطمئناً پانداها هستند. در مورد ترکیب مواد DS + Python نیز خیلی زیاد.
Shell به عنوان یک زبان پرس و جو
تعداد کمی از پروژههای پردازش و تجزیه و تحلیل دادهها که من با آنها کار کردهام، در واقع اسکریپتهای پوستهای هستند که کد را در پایتون، جاوا و خود پوسته فراخوانی میکنند. بنابراین، به طور کلی، می توانید خطوط لوله در bash/zsh/etc را به عنوان نوعی پرس و جو در سطح بالا در نظر بگیرید (البته می توانید حلقه ها را در آنجا قرار دهید، اما این برای کد DS در زبان های پوسته معمولی نیست)، اجازه دهید ارائه دهیم. یک مثال ساده - من باید یک نقشه QID از ویکی داده ها و پیوندهای کامل به ویکی های روسی و انگلیسی انجام دهم، برای این کار یک درخواست ساده از دستورات در bash نوشتم و برای خروجی یک اسکریپت ساده در پایتون نوشتم که من به این صورت کنار هم قرار دهید:
JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")'
این در واقع کل خط لوله ای بود که نقشه مورد نیاز را ایجاد کرد؛ همانطور که می بینیم همه چیز در حالت جریان کار می کرد:
مسیر فایل pv - یک نوار پیشرفت بر اساس اندازه فایل می دهد و محتویات آن را به بعد ارسال می کند
unpigz -c بخشی از آرشیو را خواند و به jq داد
jq با کلید - استریم بلافاصله نتیجه را تولید کرد و آن را به پس پردازشگر (همانطور که در همان مثال اول) در پایتون ارسال کرد.
در داخل، پس پردازشگر یک ماشین حالت ساده بود که خروجی را فرمت می کرد
در مجموع، یک خط لوله پیچیده که در حالت جریان بر روی داده های بزرگ (0.5 ترابایت)، بدون منابع قابل توجهی کار می کند و از یک خط لوله ساده و چند ابزار ساخته شده است.
نکته مهم دیگر: بتوانید در ترمینال خوب و موثر کار کنید و bash/zsh/etc را بنویسید.
کجا مفید خواهد بود؟ بله، تقریباً در همه جا - باز هم، مطالب زیادی برای مطالعه در اینترنت وجود دارد. به طور خاص، اینجا این مقاله قبلی من
برنامه نویسی R
باز هم، خواننده ممکن است فریاد بزند - خوب، این یک زبان برنامه نویسی کامل است! و البته حق با او خواهد بود. با این حال، من معمولاً با R در چنین زمینه ای مواجه می شدم که در واقع، بسیار شبیه به یک زبان پرس و جو بود.
R یک محیط و زبان محاسباتی آماری برای محاسبات و تجسم استاتیک است (مطابق با این).
گرفته شده از این رو. به هر حال، من آن را توصیه می کنم، مواد خوبی است.
چرا یک دانشمند داده باید R را بداند؟ حداقل، چون لایه عظیمی از افراد غیر فناوری اطلاعات وجود دارد که دادهها را در R تجزیه و تحلیل میکنند. من در مکانهای زیر با آن برخورد کردم:
بخش داروسازی
زیست شناسان
بخش مالی.
افرادی با تحصیلات کاملاً ریاضی که با آمار سروکار دارند.
مدلهای آماری تخصصی و مدلهای یادگیری ماشین (که اغلب فقط در نسخه نویسنده بهعنوان بسته R یافت میشوند).
چرا در واقع یک زبان پرس و جو است؟ در شکلی که اغلب یافت می شود، در واقع درخواست ایجاد یک مدل است، شامل خواندن داده ها و رفع پارامترهای پرس و جو (مدل)، و همچنین تجسم داده ها در بسته هایی مانند ggplot2 - این نیز نوعی نوشتن پرس و جو است. .
پرس و جوهای مثال برای تجسم
ggplot(data = beav,
aes(x = id, y = temp,
group = activ, color = activ)) +
geom_line() +
geom_point() +
scale_color_manual(values = c("red", "blue"))
به طور کلی، بسیاری از ایدههای R به بستههای پایتون مانند پانداها، numpy یا scipy مانند دیتافریم و بردارسازی دادهها منتقل شدهاند - بنابراین به طور کلی بسیاری از چیزها در R برای شما آشنا و راحت به نظر میرسند.
منابع زیادی برای مطالعه وجود دارد، به عنوان مثال، این.
نمودارهای دانش
در اینجا من یک تجربه کمی غیر معمول دارم، زیرا اغلب باید با نمودارهای دانش و زبان های پرس و جو برای نمودارها کار کنم. بنابراین، اجازه دهید به طور خلاصه به اصول اولیه بپردازیم، زیرا این بخش کمی عجیبتر است.
در پایگاه دادههای رابطهای کلاسیک، ما یک طرح واره ثابت داریم، اما در اینجا این طرح انعطافپذیر است، هر گزاره در واقع یک «ستون» و حتی بیشتر است.
تصور کنید که شما در حال الگوبرداری از فردی هستید و میخواهید چیزهای کلیدی را توصیف کنید، به عنوان مثال، بیایید یک شخص خاص، داگلاس آدامز را در نظر بگیریم و از این توصیف به عنوان مبنا استفاده کنیم.
اگر از یک پایگاه داده رابطهای استفاده میکردیم، باید یک جدول یا جداول بزرگ با تعداد زیادی ستون ایجاد کنیم که اکثر آنها NULL یا با مقداری False پیشفرض پر میشوند، برای مثال، بعید است که بسیاری از ما یک ستون داشته باشیم. ورودی در کتابخانه ملی کره - البته، میتوانیم آنها را در جداول جداگانه قرار دهیم، اما این در نهایت تلاشی برای مدلسازی یک مدار منطقی انعطافپذیر با محمولها با استفاده از یک رابطه ثابت است.
بنابراین تصور کنید که تمام داده ها به صورت یک نمودار یا به صورت عبارات بولی باینری و یکنواخت ذخیره می شوند.
اصلاً کجا می توانید با این روبرو شوید؟ اولا، کار کردن با ویکی دادهو با هر پایگاه داده گراف یا داده های متصل.
در زیر زبان های اصلی پرس و جو هستند که من از آنها استفاده کرده و با آنها کار کرده ام.
اما در واقع یک زبان پرس و جو برای محمولات منطقی یکپارچه و باینری است. شما به سادگی به صورت مشروط مشخص می کنید که چه چیزی در یک عبارت بولی ثابت است و چه چیزی ثابت نیست (بسیار ساده شده).
خود پایگاه RDF (Resource Description Framework) که کوئری های SPARQL بر روی آن اجرا می شود، سه گانه است. object, predicate, subject - و پرس و جو سه گانه های مورد نیاز را با توجه به محدودیت های مشخص شده در روح انتخاب می کند: یک X را پیدا کنید که p_55(X, q_33) درست باشد - که البته، p_55 نوعی رابطه با ID 55 است، و q_33 یک رابطه است. شی با شناسه 33 (اینجا و کل داستان، باز هم تمام انواع جزئیات حذف شده است).
در واقع، ما می خواهیم مقدار متغیر ?country را به گونه ای پیدا کنیم که برای محمول
Member_of، درست است که Member_of(?country,q458) و q458 شناسه اتحادیه اروپا است.
نمونه ای از یک پرس و جو واقعی SPARQL در موتور پایتون:
به طور معمول، من مجبور بودم SPARQL را به جای نوشتن آن بخوانم - در این شرایط، احتمالاً درک زبان حداقل در سطح پایه برای درک دقیق نحوه بازیابی داده ها، مهارت مفیدی است.
مطالب زیادی برای مطالعه آنلاین وجود دارد: به عنوان مثال، اینجا این и این. من معمولاً طرح ها و نمونه های خاص را در گوگل جستجو می کنم و فعلا همین کافی است.
زبان های جستجوی منطقی
در مقاله من می توانید در مورد این موضوع بیشتر بخوانید اینجا. و در اینجا، ما فقط به طور خلاصه بررسی می کنیم که چرا زبان های منطقی برای نوشتن پرس و جو مناسب هستند. اساساً RDF فقط مجموعه ای از عبارات منطقی به شکل p(X) و h(X,Y) است و یک پرس و جو منطقی شکل زیر را دارد:
output(X) :- country(X), member_of(X,“EU”).
در اینجا ما در مورد ایجاد یک خروجی گزاره جدید/1 صحبت می کنیم (/1 به معنای یکنواخت)، مشروط بر اینکه برای X درست باشد که کشور(X) - یعنی X یک کشور و همچنین عضو_of(X,EU") است.
یعنی در این حالت هم داده ها و هم قوانین به یک شکل ارائه می شوند که مدل سازی مسائل را خیلی راحت و خوب ممکن می کند.
کجا در صنعت ملاقات کردید؟: یک پروژه کل بزرگ با شرکتی که پرس و جوها را به چنین زبانی می نویسد، و همچنین در پروژه فعلی در هسته سیستم - به نظر می رسد که این یک چیز نسبتاً عجیب و غریب است، اما گاهی اوقات این اتفاق می افتد.
نمونه ای از قطعه کد در ویکی داده پردازش زبان منطقی:
مواد: من در اینجا چند پیوند به زبان برنامه نویسی منطقی مدرن Answer Set Programming می دهم - توصیه می کنم آن را مطالعه کنید: