Modern R ve / veya Python kütüphaneleri SQL'i geçersiz kılıyor mu?


14

SQL Server'ın veri işlemeden temizlemeye ve munging'e kadar yaptığımız her şeyin belkemiği olduğu bir ofiste çalışıyorum. İş arkadaşım, gelen verileri yöntemsel olarak işlemek için karmaşık işlevler ve saklı yordamlar yazma konusunda uzmanlaşmıştır, böylece standartlaştırılabilir ve raporlarda, görselleştirmelerde ve analiz projelerinde çalıştırılabilir. Buraya başlamadan önce, en temel sorguları yazmanın yanı sıra SQL ile çok az deneyimim vardı. Analiz hazırlama çalışmalarının büyük çoğunluğu R'de yapıldı. Patronum, daha verimli ve R kullanarak çok daha az kod satırı ile gerçekleştirilemeyen çok az ödev olmasına rağmen SQL becerilerimi geliştirdiğimde ısrar ediyor. dplyr, data.table ve tidyr gibi paketler (birkaç isim). Sorum şu - bu mantıklı mı?

Birkaç hafta önce, kendimi belirli ölçütleri karşılayan bir tablodaki her satır için bir sütun adı listesi alma ve bunları bir dizeler vektörüne birleştirme göreviyle karşı karşıya buldum. Sıkı bir son teslim tarihi vardı ve o zaman, bir miktar tıkanma yaşıyordum ve başımı problemin etrafına dolayamadım. Patronumdan meslektaşımdan sorunu çözmek için bir TSQL senaryosu yazmasını istedi. Üzerinde çalışırken, R'de oldukça basit bir işlev yazıp veri çerçevesinin üzerine uygulamanın bir yolunu buldum. Meslektaşım senaryosuyla yaklaşık iki saat sonra geri döndü. Döngüler için iç içe iki içeren en az 75 satırdı. Çalışmanın ne zaman bittiğini bildirmesini istedim ve birkaç saat süreceğini söyledi. Bu arada R betiğim yaklaşık 30 saniyede ~ 45.000 kayıt arasında döngü yapabildi.

R'nin verileri temizlemek ve munging için çok daha iyi bir seçim olduğunu varsaymak doğru mudur? Belki de ofisimdeki SQL geliştiricisi sadece beceriksizdir? Hem R hem de SQL (veya bu konuda Python ve SQL) ile çalışan herkesin bu konuda herhangi bir düşüncesi olup olmadığını merak ediyorum.


2
Veritabanınız yeterince küçük ve statikse, onu belleğe yükleyebilir ve dplyr gibi tercih ettiğiniz ETL aracını kullanabilirsiniz. Bulutta büyük verileriniz olduğunda yaklaşımınız işe yaramaz. Düzenli olarak BigQuery (Google) 'ı şikayet eden sorgular çalıştırıyorum. Sorguları doğrudan SQL'de yazıyorum, ancak istersem veri çerçevelerinde çalışmak için orta katman olarak Spark'ı kullanabilirim.
Emre

1
Öyleyse SQL, verilerin depolanma şekli açısından R'den doğal olarak daha verimli midir, yoksa sadece SQL sunucularının daha yerleşik bellek ve işlem gücüne sahip olma eğilimi mi vardır?
AffableAmbler

1
Battaniye bir açıklama yapamazsınız - uygulamaya bağlıdır - ancak iyi veritabanlarının sorgu iyileştiricileri vardır ve bazıları (BigQuery gibi) çok çekirdekli yürütmeyi destekler. Belki de SQL'den kaçınmak için veritabanınızın üstünde bir veri çerçevesi veya ORM soyutlamasıdır. Dplyr zaten bunu bir ölçüde yapıyor gibi görünüyor (cf. SQL çevirisi ). Bulmak için aynı sorguyu dplyr'de ham SQL ile karşılaştırabilirsiniz. Bazıları prototipleme için küçük bir veri örneği almak, daha sonra üretim için büyük veri araçlarını
Emre

3
Yapabilirsin basitçe SQL Server içinde Ar çalıştırmak ve her iki dünyanın en iyisine sahip
Gaius

Yanıtlar:


13

R ve SQL birbirinden tamamen farklı iki canavardır. SQL, veritabanlarında depolanan verileri önceden deneyimlediğiniz gibi sorgulamak için kullanabileceğiniz bir dildir. SQL'in R'ye karşı faydaları çoğunlukla veritabanı sunucusu (MS SQL, Oracle, PostgreSQL, MySQL, vb.) Gerçeğinde yatmaktadır.

Çoğu olmasa da, modern veritabanı sunucuları birden çok kullanıcının aynı veri kaynağından veri sorgulamasına ve verilerin tutarlı kalmasını sağlarken aynı tablolara veri eklemesine, güncellemesine ve silmesine izin verir. Bu bir banka işleminin kaydedilmesi için önemlidir. R'de bir banka işletmeyi hayal edebiliyor musunuz? Burada veritabanı sunucuları devreye girer. Prosedürlerin ACID özelliklerinin veritabanında çalışmasını sağlarlar. ACID Atomisite, eşzamanlılık, izolasyon ve dayanıklılık anlamına gelir (bkz . Wikipedia'da ACID açıklaması ). R, her şeyin bellekte gerçekleştiği tek bir kullanıcı platformudur. Dolayısıyla, bilgisayarınız büyük bir işlemde yarıya kadar çalışmayı durdurursa, verileriniz depolanmaz. Ayrıca verilere erişebilen tek kişi sizsiniz. Açıkçası, R veritabanı sunucuları ve / veya SQL için bir alternatif olarak kabul edilmez.

Veritabanı sunucularının bir diğer ana avantajı, iyi bir veritabanı tasarımının, sorgu optimizasyonu yaparak veritabanınızı hızlı bir şekilde sorgulayabilmenizi sağlamasıdır. Bu veritabanı sunucularına ulaşmak için bir tablonun tasarımını takip edin. Bu konuyla ilgili tam bir tartışma için wiki sayfasına bakın . R sorgu optimizasyonu gerçekleştiremiyor. Kötü veritabanı tasarımı, sorgularınızın yavaş yürütülmesine yol açabilir. Veritabanı tasarımında yabancı anahtarlar doğru kullanılırsa, veritabanı sunucuları birden çok tabloyu sorgulayan sorgular üzerinde optimizasyon da yapabilir.

SQL dili çok farklı bir sözdizimine sahiptir ve veri tablosu veya dplyr sözdizimini kullanarak veri munging adımları yazmanın daha kısa olduğu deneyiminizi paylaşıyorum. Ancak, bazen verileriniz R için çok büyüktür veya sonuçları veritabanında periyodik bir toplu işin parçası olarak depolamanız gerekir; bu da mantığınızı SQL'de kodlamanız gerekir.

Deneyimlerime göre, SQL ve R / Python için özel kullanım durumları vardır. SQL, iş açısından kritik verileri depolamak ve birden çok kişinin merkezi bir ortamda verilere erişmesine, bunları değiştirmesine, eklemesine ve silmesine izin vermek için mükemmeldir. Bir kerelik veri için R ve Python munging mükemmeldir. Veri tarama işleminizin düzenli aralıklarla yürütülmesi gerekiyorsa, R / Python komut dosyanızı SQL'e taşımanız gerekir.


3

Bunlar gerçekten karşılaştırılamaz. SQL verilere erişmek için kullanılan bir dildir, R verilerle çalışmak için kullanılan bir dildir.

SQL, ara adımları görmek zor olduğundan ve hatalar attığında verilerinizin biçimini / kalitesini / yapısını ele alması muhtemel olmadığından, munging için etkili bir araç değildir.

İş akışım genellikle:

  1. Ham sorguyu SQL sorgusundan alma (R cinsinden)
  2. Munging rutini yap
  3. Mümkünse, R'de tamamladığım mungingi gerçekleştirmek için SQL sorgusunu yeniden yazın

Ayrıca, tüm veri tüketicilerinin R kullanmadığını, ancak birçoğunun hala kendi platformlarını SQL kullanan verilerle arayüzlediğini unutmayın.


1
Bu benim takip ettiğim süreçtir (amirimin beğenmediği kadar). Yukarıda tarif ettiğim gibi karmaşık munging görevlerini yerine getirmenin, R gibi bir dilde çok daha verimli bir şekilde yapıldığını kabul ediyorum (Beyanı takdir edin). Ancak SQL'in tek amacı verileriniz için dev bir sabit sürücü olmaksa, neden sadece bir R sunucunuz olmasın? Görünüşe göre tüm fonksiyonlar (haritalama, tabloları bağlamak için anahtarları ayarlama, gruplama ve verileri birleştirme) R'de çok etkili bir şekilde yapılabilir. SQL tablosu bellek kullanımı açısından R veri çerçevesinden daha mı verimli?
AffableAmbler

1
@Hayır çünkü herkes R kullanmaz.
HEITZ

2

kitaplığı (dbplyr) doğru yaklaşıma sahiptir: her şeyi R'ye (tidyverse kullanarak) yazın ve kütüphanenin tam zamanında R kodunu düşük seviyeli SQL'e "derlemesine" izin verin.

Tüm munging çevrilebilir olmadığından, SQL Server tarafından alınan başka bir yaklaşım: R kodu parçacıklarının SQL "select" komutlarından çağrılmasına izin verin.


1

HEITZ tarafından bahsedilen 1., 2., 3. yaklaşımı benim deneyimime göre R (data.table) 'dan MySQL'e geri yazdığınız 3. alternatifi ile uzanmak mümkündür.

Yani tam adımlar MySQL-> data.table-> MySQL

DT'yi de RAM dostu olarak kopyalamadığınız data.table sözdizimini kullandığınızdan emin olursanız.


1

Tek kelimeyle HAYIR . SQL , üzerine yapılandırılmış yarı yapılandırılmış ve hatta yapılandırılmamış verileri tanımlamanın ve özetlemenin güçlü ve özlü ve esnek bir yoludur. Bu arada sql, veri bilimcileri için neredeyse bir zorunluluk olarak kabul edilir.

SQL temel faaliyetlerini gerçekleştirmenin kısa ve güçlü bir yoludur:

  • projeksiyonlar ( seçin ..)
  • filtreleme ( nerede ..)
  • (filtreleme / gruplama grubu tarafından ve sahip olan )
  • temel toplamalar ( sayım , toplam , ort .)
  • katılır

Gerçek güç, sonuçları satır içi görünümler kullanarak birleştirirken gelir . Ben birini kullanacağını yapmak gerektiğinde sqldf, pandasql, pysparkSql/ sparkSqlveya doğrudan rdbms bağlantısı. Aynı şeyi data.table(çok daha iyi data.frame) veya datatable(daha iyi ) ile mümkün olan en kısa şekilde yazmak, denenen sorguların karmaşıklığına bağlı olarak daha karmaşık pandas, çok daha karmaşık veya neredeyse imkansızdır.

Veri munging için : bu farklı bir hikaye: bazı işlemler sql cinsinden kolayca ifade edilir, bazıları çok fazla değil. Bununla birlikte, UDFs'yi birleştirdiğinizde , elde edilebilecek şeylerin daha geniş bir enlemi vardır. Şu anki görevim UDF, müşteri kavşak işlemleri, özel toplamalar ve özel puanlama yöntemleri gibi şeyler yapmak için birkaç tane içerir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.