Python veya R’de çalışan veri bilimcileri, verileri genellikle REST API’leri aracılığıyla alır. Her iki ortam da REST uç noktalarına HTTP çağrıları yapmanıza ve ardından JSON yanıtlarını veri çerçevelerine dönüştürmenize yardımcı olan kitaplıklar sağlar. Ama bu asla bizim istediğimiz kadar basit değil. Bir REST API’sinden çok fazla veri okurken, bunu bir seferde bir sayfa yapmanız gerekir, ancak sayfalandırma bir API’den diğerine farklı şekilde çalışır. Ortaya çıkan JSON yapılarını açmak da öyle. HTTP ve JSON düşük seviye standartlardır ve REST gevşek tanımlanmış bir çerçevedir, ancak hiçbir şey mutlak basitliği garanti etmez, API’ler arasında tutarlılığı boşverin.
Ya tüm düşük seviyeli homurdanan işleri soyutlayan ve her yerde aynı şekilde çalışan API’lerden okumanın bir yolu olsaydı? İyi haberler! Steampipe’ın yaptığı tam olarak budur. REST API çağrılarını doğrudan SQL tablolarına çeviren bir araçtır. İşte Steampipe’ı kullanarak sorup cevaplayabileceğiniz üç soru örneği.
Daha hızlı öğrenin. Daha derin kaz. Daha uzağa bakın.
1. Twitter: PySpark’tan bahseden son tweetler nelerdir?
İşte bu soruyu sormak için bir SQL sorgusu:
select
id,
text
from
twitter_search_recent
where
query = 'pyspark'
order by
created_at desc
limit 5;
İşte cevap:
+---------------------+------------------------------------------------------------------------------------------------>
| id | text >
+---------------------+------------------------------------------------------------------------------------------------>
| 1526351943249154050 | @dump Tenho trabalhando bastante com Spark, mas especificamente o PySpark. Vale a pena usar um >
| 1526336147856687105 | RT @MitchellvRijkom: PySpark Tip ⚡ >
| | >
| | When to use what StorageLevel for Cache / Persist? >
| | >
| | StorageLevel decides how and where data should be s… >
| 1526322757880848385 | Solve challenges and exceed expectations with a career as a AWS Pyspark Engineer. https://t.co/>
| 1526318637485010944 | RT @JosMiguelMoya1: #pyspark #spark #BigData curso completo de Python y Spark con PySpark >
| | >
| | https://t.co/qf0gIvNmyx >
| 1526318107228524545 | RT @money_personal: PySpark & AWS: Master Big Data With PySpark and AWS >
| | #ApacheSpark #AWSDatabases #BigData #PySpark #100DaysofCode >
| | -> http… >
+---------------------+------------------------------------------------------------------------------------------------>
Burada sorgulanan twitter_search_recent tablosu, Twitter’ın çıktısını alır. /2/tweetler/arama/son zamanlarda bitiş noktası ve bu sütunlarla bir tablo olarak formüle eder. Bu API uç noktasına bir HTTP çağrısı yapmanız veya sonuçları açmanız gerekmez, belgelenmiş sütunlara başvuran bir SQL sorgusu yazmanız yeterlidir. Bu sütunlardan biri, query
özeldir: Twitter’ın sorgu sözdizimi. Burada, sadece eşleşen tweetleri arıyoruz PySpark ancak sorguyu belirli kullanıcılara, URL’lere, türlere (is:retweet
, is:reply
), özellikleri (has:mentions
, has_media
), vb. API’ye nasıl erişiyor olursanız olun bu sorgu sözdizimi aynıdır: Python’dan, R’den veya Steampipe’dan. Düşünecek çok şey var ve Twitter verilerini araştırmak için sorgular hazırlarken gerçekten bilmeniz gereken her şey.
2. GitHub: PySpark’tan bahseden depolar nelerdir?
İşte bu soruyu sormak için bir SQL sorgusu:
select
name,
owner_login,
stargazers_count
from
github_search_repository
where
query = 'pyspark'
order by stargazers_count desc
limit 10;
İşte cevap:
+----------------------+-------------------+------------------+
| name | owner_login | stargazers_count |
+----------------------+-------------------+------------------+
| SynapseML | microsoft | 3297 |
| spark-nlp | JohnSnowLabs | 2725 |
| incubator-linkis | apache | 2524 |
| ibis | ibis-project | 1805 |
| spark-py-notebooks | jadianes | 1455 |
| petastorm | uber | 1423 |
| awesome-spark | awesome-spark | 1314 |
| sparkit-learn | lensacom | 1124 |
| sparkmagic | jupyter-incubator | 1121 |
| data-algorithms-book | mahmoudparsian | 1001 |
+----------------------+-------------------+------------------+
Bu ilk örneğe çok benziyor! Bu durumda, sorgulanan tablo, github_search_repository, çıktıyı GitHub’ın /search/repositories uç noktasından alır ve bu sütunlarla bir tablo olarak formüle eder.
Her iki durumda da Steampipe belgeleri size yalnızca eşlenmiş tabloları yöneten şemaları göstermekle kalmaz, aynı zamanda tabloları çeşitli şekillerde kullanan SQL sorgularının örneklerini de (Twitter, GitHub) verir.
Bunların mevcut birçok tablodan sadece ikisi olduğunu unutmayın. Twitter API’si 7 tabloya eşlenir ve GitHub API’si 41 tabloya eşlenir.
3. Twitter + GitHub: Son zamanlarda PySpark ile ilgili depoların sahipleri ne tweetledi?
Bu soruyu cevaplamak için iki farklı API’ye başvurmamız ve ardından sonuçlarını birleştirmemiz gerekiyor. Python veya R’de REST yükleri üzerinde akıl yürütürken tutarlı bir şekilde bunu yapmak daha da zordur. Ancak bu, SQL’in yapmak için doğduğu türden bir şeydir. İşte soruyu SQL’de sormanın bir yolu.
-- find pyspark repos
with github_repos as (
select
name,
owner_login,
stargazers_count
from
github_search_repository
where
query = 'pyspark' and name ~ 'pyspark'
order by stargazers_count desc
limit 50
),
-- find twitter handles of repo owners
github_users as (
select
u.login,
u.twitter_username
from
github_user u
join
github_repos r
on
r.owner_login = u.login
where
u.twitter_username is not null
),
-- find corresponding twitter users
select
id
from
twitter_user t
join
github_users g
on
t.username = g.twitter_username
)
-- find tweets from those users
select
t.author->>'username' as twitter_user,
'https://twitter.com/' || (t.author->>'username') || '/status/' || t.id as url,
t.text
from
twitter_user_tweet t
join
twitter_userids u
on
t.user_id = u.id
where
t.created_at > now()::date - interval '1 week'
order by
t.author
limit 5
İşte cevap:
+----------------+---------------------------------------------------------------+------------------------------------->
| twitter_user | url | text >
+----------------+---------------------------------------------------------------+------------------------------------->
| idealoTech | https://twitter.com/idealoTech/status/1524688985649516544 | Are you able to find creative soluti>
| | | >
| | | Join our @codility Order #API Challe>
| | | >
| | | #idealolife #codility #php >
| idealoTech | https://twitter.com/idealoTech/status/1526127469706854403 | Our #ProductDiscovery team at idealo>
| | | >
| | | Think you can solve it? ? >
| | | ➡️ https://t.co/ELfUfp94vB https://t>
| ioannides_alex | https://twitter.com/ioannides_alex/status/1525049398811574272 | RT @scikit_learn: scikit-learn 1.1 i>
| | | What's new? You can check the releas>
| | | >
| | | pip install -U… >
| andfanilo | https://twitter.com/andfanilo/status/1524999923665711104 | @edelynn_belle Thanks! Sometimes it >
| andfanilo | https://twitter.com/andfanilo/status/1523676489081712640 | @juliafmorgado Good luck on the reco>
| | | >
| | | My advice: power through it + a dead>
| | | >
| | | I hated my first few short videos bu>
| | | >
| | | Looking forward to the video ?
API’ler sorunsuz bir şekilde tablolar haline geldiğinde, tüm dikkatinizi bu API’ler tarafından temsil edilen soyutlamalar üzerinde akıl yürütmeye ayırabilirsiniz. Perl’in yaratıcısı Larry Wall, ünlü bir şekilde şöyle dedi: “Kolay şeyler kolay olmalı, zor şeyler mümkün olmalı.” İlk iki örnek, olması gereken ve kolay olan şeylerdir: her biri, hiçbir sihirbazlık gerektirmeyen yalnızca 10 satırlık basit, dümdüz SQL’dir.
Üçüncü örnek daha zor bir şeydir. Herhangi bir programlama dilinde zor olurdu. Ancak SQL bunu birkaç güzel yolla mümkün kılar. Çözüm, bir ardışık düzen oluşturan kısa stanzalardan (CTE’ler, Ortak Tablo İfadeleri) yapılır. Boru hattının her aşaması, sorunun açıkça tanımlanmış bir parçasını ele alır. Bir sonrakine geçmeden önce her aşamanın çıktısını doğrulayabilirsiniz. Ve tüm bunları, verilerin seçimi, filtrelenmesi ve yeniden birleştirilmesi için en gelişmiş ve yaygın olarak kullanılan dilbilgisi ile yapabilirsiniz.
SQL kullanmak zorunda mıyım?
Numara! API’leri tablolarla eşleştirme fikrini seviyorsanız, ancak Python veya R veri çerçevelerindeki bu tablolar üzerinde akıl yürütmeyi tercih ediyorsanız, Steampipe bunu zorunlu kılabilir. Kapakların altında, API’den tabloya dönüşümü yöneten yabancı veri sarmalayıcılarla geliştirilmiş Postgres var. Python’s gibi SQL sürücüleri de dahil olmak üzere Postgres’e bağlanabilen her şey Steampipe’a bağlanabilir. psycopg2
ve R’ler RPostgres
Metabase, Tableau ve PowerBI gibi iş zekası araçlarının yanı sıra. Böylece, API’leri veri çerçevelerine sorunsuzca tüketmek için Steampipe’ı kullanabilir, ardından Python veya R’deki veriler üzerinde akıl yürütebilirsiniz.
Ancak daha önce SQL’i bu şekilde kullanmadıysanız, bir göz atmaya değer. Pandalarda SQL sorgularınızı nasıl yeniden yazarsınız bölümünden SQL ile Pandalar arasındaki bu karşılaştırmayı düşünün.
SQL | pandalar |
---|---|
havaalanlarından * seçin | havaalanları |
havaalanları sınırı 3’ten * seçin | havaalanları.head(3) |
ident = ‘KLAX’ olan havaalanlarından kimliği seçin | havaalanları[airports.ident == ‘KLAX’].İD |
havaalanından farklı bir tür seçin | havaalanları.type.benzersiz() |
iso_region = ‘US-CA’ olan havaalanlarından * seçin ve = ‘seaplane_base’ yazın | havaalanları[(airports.iso_region == ‘US-CA’) & (airports.type == ‘seaplane_base’)] |
iso_region = ‘US-CA’ ve type = ‘large_airport’ olan havalimanlarından kimliği, adı, belediyeyi seçin | havaalanları[(airports.iso_region == ‘US-CA’) & (airports.type == ‘large_airport’)][[‘ident’, ‘name’, ‘municipality’]] |
Bir stilin diğerine karşı üstünlüklerini tartışabiliriz, ancak SQL’in bu işlemleri veriler üzerinde ifade etmenin en evrensel ve yaygın olarak uygulanan yolu olduğuna şüphe yok. Yani hayır, Steampipe’dan yararlanmak için SQL’i tam potansiyeliyle kullanmak zorunda değilsiniz. Ama istediğini bulabilirsin.