Apakah pustaka R dan / atau Python modern membuat SQL usang?

14

Saya bekerja di kantor di mana SQL Server adalah tulang punggung dari semua yang kami lakukan, dari pemrosesan data hingga pembersihan hingga munging. Kolega saya mengkhususkan diri dalam penulisan fungsi kompleks dan prosedur tersimpan untuk memproses data yang masuk secara metodis sehingga dapat distandarisasi dan digunakan dalam laporan, visualisasi, dan proyek analitik. Sebelum memulai di sini, saya memiliki sedikit pengalaman dengan SQL, selain menulis pertanyaan paling mendasar. Sebagian besar pekerjaan persiapan analisis saya semua dilakukan di R. Bos saya bersikeras bahwa saya meningkatkan keterampilan SQL saya, meskipun tampaknya ada sedikit tugas yang tidak dapat dilakukan lebih efisien dan dengan jauh lebih sedikit baris kode menggunakan R paket-paket seperti dplyr, data.table, dan tidyr (untuk beberapa nama). Pertanyaan saya adalah - apakah ini masuk akal?

Beberapa minggu yang lalu, saya mendapati diri saya dihadapkan pada tugas untuk mendapatkan daftar nama kolom untuk setiap baris dalam tabel yang memenuhi kriteria tertentu dan menyatukannya menjadi vektor string. Ada tenggat waktu yang ketat dan pada saat itu, saya mengalami beberapa penyumbatan dan tidak bisa membungkus kepala saya dengan masalah. Saya bertanya kepada bos saya, yang pada gilirannya meminta rekan saya untuk menulis skrip TSQL untuk menyelesaikan masalah. Ketika dia sedang mengerjakannya, saya menemukan cara untuk melakukannya dalam menulis fungsi yang cukup sederhana dan menerapkannya pada bingkai data. Rekan saya kembali dengan naskahnya sekitar dua jam kemudian. Itu setidaknya 75 baris terdiri dari dua bersarang untuk loop. Saya memintanya untuk memberi tahu ketika sudah selesai berjalan dan dia bilang itu akan memakan waktu beberapa jam. Sementara itu skrip R saya dapat mengulangi ~ 45.000 catatan dalam waktu sekitar 30 detik.

Apakah saya benar berasumsi bahwa R adalah pilihan yang jauh lebih baik untuk membersihkan dan merawat data? Mungkin pengembang SQL di kantor saya tidak kompeten? Saya ingin tahu apakah ada orang yang telah bekerja dengan R dan SQL (atau Python dan SQL dalam hal ini) memiliki pemikiran tentang ini.

AffableAmbler
sumber
2
Jika basis data Anda cukup kecil dan statis, Anda dapat memuatnya ke dalam memori dan menggunakan alat ETL pilihan Anda, seperti dplyr. Pendekatan Anda tidak akan berfungsi ketika Anda memiliki data besar di cloud. Saya secara teratur menjalankan kueri yang membuat BigQuery (Google) mengeluh. Saya menulis query langsung dalam SQL tapi saya bisa menggunakan Spark sebagai lapisan tengah untuk beroperasi dalam dataframe jika saya mau.
Emre
1
Jadi apakah SQL secara inheren lebih efisien daripada R dalam hal cara data disimpan, atau apakah hanya server SQL yang cenderung memiliki lebih banyak memori yang terpasang dan daya pemrosesan?
AffableAmbler
1
Anda tidak dapat membuat pernyataan selimut - tergantung pada implementasi - tetapi database yang baik memiliki pengoptimal kueri, dan beberapa di antaranya (seperti BigQuery) mendukung eksekusi multicore. Mungkin yang Anda inginkan adalah dataframe atau abstraksi ORM di atas database Anda untuk menghindari SQL. Tampaknya dplyr sudah melakukan ini sampai batas tertentu (lih. Terjemahan SQL ). Anda bisa membandingkan permintaan yang sama dalam dplyr dengan SQL mentah untuk mengetahuinya. Apa yang dilakukan sebagian orang adalah mengambil sampel kecil data untuk pembuatan prototipe, lalu mengeluarkan alat data besar untuk produksi
Emre
3
Anda cukup menjalankan R di dalam SQL Server dan mendapatkan yang terbaik dari kedua dunia
Gayus

Jawaban:

13

R dan SQL adalah dua binatang yang sama sekali berbeda. SQL adalah bahasa yang bisa Anda gunakan untuk query data yang disimpan dalam database seperti yang sudah Anda alami. Manfaat SQL versus R sebagian besar terletak pada fakta server database (MS SQL, Oracle, PostgreSQL, MySQL, dll.).

Sebagian besar, jika tidak semua, server database modern mengizinkan banyak pengguna untuk meminta data dari sumber data yang sama dan menyisipkan, memperbarui, dan menghapus data dalam tabel yang sama sambil memastikan bahwa data tetap konsisten. Ini penting untuk mengatakan merekam transaksi bank. Bisakah Anda bayangkan menjalankan bank di R? Di situlah server database masuk. Mereka memastikan properti prosedur ACID berjalan pada database. ACID adalah kependekan dari Atomicity, concurrency, isolasi dan daya tahan (lihat deskripsi ACID di wikipedia ). R adalah platform pengguna tunggal di mana semuanya terjadi dalam memori. Jadi, jika komputer Anda berhenti bekerja setengah dalam operasi besar, data Anda tidak akan disimpan. Anda juga satu-satunya orang yang dapat mengakses data. Agar jelas, R tidak dianggap sebagai alternatif untuk server basis data dan / atau SQL.

Keuntungan utama lain dari server basis data adalah bahwa desain basis data yang baik akan memastikan bahwa Anda dapat meminta basis data dengan cepat dengan melakukan optimasi kueri. Untuk mencapai ini server database melacak desain tabel. Lihat diskusi lengkap tentang topik ini di halaman wiki . R tidak dapat melakukan optimasi kueri. Desain basis data yang buruk, dapat menyebabkan eksekusi permintaan Anda lambat. Server database juga dapat melakukan optimasi atas kueri yang meminta beberapa tabel jika kunci asing digunakan dengan benar dalam desain database.

Bahasa SQL memiliki sintaks yang sangat berbeda dan saya berbagi pengalaman Anda bahwa lebih pendek untuk menulis langkah-langkah munging data menggunakan tabel data atau sintaks dplyr. Namun, kadang-kadang data Anda terlalu besar untuk R atau Anda perlu menyimpan hasil dalam database sebagai bagian dari pekerjaan batch berkala, yang akan membutuhkan kode logika Anda dalam SQL.

Dalam pengalaman saya ada kasus penggunaan khusus untuk SQL dan R / Python. SQL sangat bagus untuk menyimpan data penting bisnis dan untuk memungkinkan banyak orang mengakses, memodifikasi, menyisipkan, dan menghapus data dalam lingkungan yang terpusat. Untuk setiap data satu-off munging R dan Python sangat bagus. Jika munging data Anda perlu dieksekusi secara berkala, Anda harus mem-porting skrip R / Python ke SQL.

Stereo
sumber
3

Ini bahkan tidak sebanding, sungguh. SQL adalah bahasa yang dimaksudkan untuk mengakses data, R adalah bahasa yang dimaksudkan untuk bekerja dengan data.

SQL bukan alat yang efektif untuk munging karena sulit untuk melihat langkah-langkah perantara dan ketika itu melempar kesalahan, itu tidak mungkin untuk mengatasi bentuk / kualitas / struktur data Anda.

Alur kerja saya biasanya:

  1. Dapatkan data mentah dari kueri SQL (dalam R)
  2. Bangun rutin munging
  3. Jika memungkinkan, tulis ulang query SQL untuk menyelesaikan munging yang saya lakukan di R

Sadar juga bahwa tidak semua konsumen data menggunakan R, tetapi banyak yang masih menghubungkan platform pilihan mereka dengan data menggunakan SQL.

HEITZ
sumber
1
Ini adalah proses yang sama yang saya ikuti (sangat tidak disukai atasan saya). Saya setuju bahwa melakukan tugas munging kompleks seperti yang saya jelaskan di atas tampaknya jauh lebih efisien dilakukan dalam bahasa seperti R. (Menghargai penegasan). Tetapi jika satu-satunya tujuan dari SQL adalah menjadi hard drive raksasa untuk data Anda, mengapa tidak hanya memiliki server R? Sepertinya semua fungsi (pemetaan, pengaturan kunci untuk menghubungkan tabel, pengelompokan, dan menggabungkan data) sekarang semua dapat dilakukan dengan sangat efektif di R. Apakah tabel SQL lebih efisien dalam hal penggunaan memori daripada kerangka data R?
AffableAmbler
1
@Noah karena tidak semua orang menggunakan R.
HEITZ
2

library (dbplyr) memiliki pendekatan yang benar: tulis semuanya dalam R (menggunakan tidyverse) dan biarkan perpustakaan just-in-time "kompilasi" kode R ke SQL tingkat rendah.

Karena tidak semua munging dapat diterjemahkan, pendekatan lain adalah yang diambil oleh SQL Server: biarkan potongan kode R dipanggil dari perintah "pilih" SQL.

Dan Reznik
sumber
1

Pendekatan 1., 2., 3. yang disebutkan oleh HEITZ dalam pengalaman saya mungkin diperluas dengan alternatif untuk 3. di mana Anda menulis data Anda dari R (data.table) kembali ke MySQL.

Jadi langkah penuh adalah MySQL-> data.table-> MySQL

Jika Anda memastikan Anda menggunakan sintaks data.tabel di mana Anda tidak menyalin DT-nya juga ramah RAM.

Niels Krogh
sumber
1

Dalam sebuah kata TIDAK . SQL adalah cara ringkas dan fleksibel yang kuat untuk menggambarkan dan merangkum data terstruktur semi terstruktur dan bahkan tidak terstruktur - ketika lapisan penerjemah yang tepat ditempatkan di atasnya. Omong-omong sqldianggap hampir harus dimiliki oleh para ilmuwan data.

SQL adalah cara ringkas dan kuat untuk melakukan operasi intinya:

  • proyeksi ( pilih ..)
  • pemfilteran (di mana ..)
  • pengelompokan / pemfilteran ( dikelompokkan berdasarkan dan memiliki )
  • agregasi dasar ( hitung , jumlah , rata-rata ..)
  • bergabung

Kekuatan sebenarnya datang saat menggabungkan hasil menggunakan tampilan inline . Ketika saya harus melakukan itu saya akan menggunakan salah satu dari sqldf, pandasql, pysparkSql/ sparkSqlatau koneksi RDBMS langsung. Menulis yang sama dengan cara yang paling ringkas dengan data.table(jauh lebih baik dari data.frame) atau datatable(lebih baik dari pandas) masih lebih kikuk, jauh lebih kikuk atau hampir tidak mungkin tergantung pada kompleksitas dari pertanyaan yang dicoba.

Untuk data munging : itu adalah cerita yang berbeda: beberapa operasi mudah diekspresikan dalam sql dan beberapa tidak begitu banyak. Namun ketika Anda memasukkan UDFada garis lintang yang lebih luas dari apa yang bisa dicapai. Tugas saya saat ini termasuk sejumlah UDFs untuk melakukan hal-hal seperti operasi persimpangan pelanggan , agregasi kustom , dan metode penilaian kustom .

javadba
sumber