Các thư viện R và / hoặc Python hiện đại có làm cho SQL lỗi thời không?


14

Tôi làm việc trong một văn phòng nơi SQL Server là xương sống của tất cả mọi thứ chúng tôi làm, từ xử lý dữ liệu đến dọn dẹp cho đến munging. Đồng nghiệp của tôi chuyên viết các hàm phức tạp và các thủ tục được lưu trữ để xử lý một cách có phương pháp dữ liệu đến để nó có thể được chuẩn hóa và đưa vào làm việc trong các báo cáo, trực quan hóa và các dự án phân tích. Trước khi bắt đầu ở đây, tôi có rất ít kinh nghiệm với SQL, ngoài việc viết các truy vấn cơ bản nhất. Phần lớn công việc chuẩn bị phân tích của tôi đều được thực hiện trong R. Ông chủ của tôi khẳng định rằng tôi cải thiện các kỹ năng SQL của mình, mặc dù dường như có rất ít bài tập không thể được thực hiện hiệu quả hơn và với ít dòng mã hơn sử dụng R các gói như dplyr, data.table và tidyr (để đặt tên cho một số ít). Câu hỏi của tôi là - điều này có ý nghĩa?

Một vài tuần trước, tôi thấy mình phải đối mặt với nhiệm vụ lấy danh sách các tên cột cho mỗi hàng trong một bảng đáp ứng các tiêu chí nhất định và ghép chúng thành một chuỗi các chuỗi. Có một thời hạn chặt chẽ và vào thời điểm đó, tôi đã gặp phải một số tắc nghẽn và không thể hoàn toàn xoay quanh vấn đề này. Tôi đã hỏi sếp của mình, người đã lần lượt yêu cầu đồng nghiệp của tôi viết kịch bản TSQL để giải quyết vấn đề. Trong khi anh ta đang làm việc với nó, tôi đã tìm ra một cách để làm điều đó trong R bằng cách viết một hàm khá đơn giản và áp dụng nó trên khung dữ liệu. Đồng nghiệp của tôi đã trở lại với kịch bản của anh ấy khoảng hai giờ sau đó. Đó là ít nhất 75 dòng bao gồm hai dòng lồng nhau. Tôi yêu cầu anh ta thông báo khi nó chạy xong và anh ta nói sẽ mất vài giờ. Trong khi đó, tập lệnh R của tôi có thể lặp lại hơn ~ 45.000 bản ghi trong khoảng 30 giây.

Tôi có đúng không khi cho rằng R là lựa chọn tốt hơn nhiều để làm sạch và trộn dữ liệu? Có lẽ nhà phát triển SQL trong văn phòng của tôi chỉ mới sử dụng? Tôi tò mò liệu bất kỳ ai đã làm việc với cả R và SQL (hoặc Python và SQL cho vấn đề đó) có bất kỳ suy nghĩ nào về vấn đề này.


2
Nếu cơ sở dữ liệu của bạn đủ nhỏ và tĩnh, bạn có thể tải nó vào bộ nhớ và sử dụng công cụ ETL ưa thích của bạn, như dplyr. Cách tiếp cận của bạn đơn giản sẽ không hiệu quả khi bạn có dữ liệu lớn trên đám mây. Tôi thường xuyên chạy các truy vấn khiến BigQuery (Google) phàn nàn. Tôi viết các truy vấn trực tiếp bằng SQL nhưng tôi có thể sử dụng Spark làm lớp giữa để hoạt động trong các tệp dữ liệu nếu tôi muốn.
Emre

1
Vì vậy, SQL vốn đã hiệu quả hơn R về cách lưu trữ dữ liệu, hay chỉ là các máy chủ SQL có xu hướng có nhiều bộ nhớ và khả năng xử lý tích hợp hơn?
AffableAmbler

1
Bạn không thể đưa ra tuyên bố về chăn - tùy thuộc vào việc triển khai - nhưng cơ sở dữ liệu tốt có trình tối ưu hóa truy vấn và một số trong số chúng (như BigQuery) hỗ trợ thực thi đa lõi. Có thể những gì bạn muốn là một khung dữ liệu hoặc trừu tượng ORM trên đầu cơ sở dữ liệu của bạn để tránh SQL. Dường như dplyr đã làm điều này ở một mức độ nào đó (xem bản dịch SQL ). Bạn có thể đánh giá cùng một truy vấn trong dplyr so với SQL thô để tìm hiểu. Những gì một số người làm là lấy một mẫu dữ liệu nhỏ để tạo mẫu, sau đó lấy ra các công cụ dữ liệu lớn để sản xuất
Emre

3
Bạn chỉ có thể chạy R bên trong SQL Server và có cả hai thế giới tốt nhất
Gaius

Câu trả lời:


13

R và SQL là hai con thú hoàn toàn khác nhau. SQL là ngôn ngữ mà bạn có thể sử dụng để truy vấn dữ liệu được lưu trữ trong cơ sở dữ liệu như bạn đã trải nghiệm. Lợi ích của SQL so với R chủ yếu nằm ở thực tế của máy chủ cơ sở dữ liệu (MS SQL, Oracle, PostgreQuery, MySQL, v.v.).

Hầu hết, nếu không phải tất cả, các máy chủ cơ sở dữ liệu hiện đại cho phép nhiều người dùng truy vấn dữ liệu từ cùng một nguồn dữ liệu và chèn, cập nhật và xóa dữ liệu trong cùng một bảng trong khi vẫn đảm bảo dữ liệu vẫn nhất quán. Điều này là cần thiết để nói ghi lại một giao dịch ngân hàng. Bạn có thể tưởng tượng điều hành một ngân hàng trên R? Đó là nơi các máy chủ cơ sở dữ liệu đến. Chúng đảm bảo các thuộc tính ACID của các thủ tục chạy trên cơ sở dữ liệu. ACID là viết tắt của Nguyên tử, đồng thời, cách ly và độ bền (xem mô tả ACID trên wikipedia ). R là một nền tảng người dùng duy nhất nơi mọi thứ xảy ra trong bộ nhớ. Vì vậy, nếu máy tính của bạn ngừng hoạt động nửa chừng trong một hoạt động lớn, dữ liệu của bạn sẽ không được lưu trữ. Bạn cũng là người duy nhất có thể truy cập dữ liệu. Để rõ ràng, R không được coi là một sự thay thế cho các máy chủ cơ sở dữ liệu và / hoặc SQL.

Một ưu điểm chính khác của máy chủ cơ sở dữ liệu là thiết kế cơ sở dữ liệu tốt sẽ đảm bảo rằng bạn có thể truy vấn cơ sở dữ liệu của mình nhanh bằng cách thực hiện tối ưu hóa truy vấn. Để đạt được cơ sở dữ liệu này, các máy chủ theo dõi thiết kế của một bảng. Xem để thảo luận đầy đủ về chủ đề này trang wiki . R không thể thực hiện tối ưu hóa truy vấn. Thiết kế cơ sở dữ liệu kém, có thể dẫn đến việc thực hiện các truy vấn của bạn chậm. Các máy chủ cơ sở dữ liệu cũng có thể thực hiện tối ưu hóa qua các truy vấn truy vấn nhiều bảng nếu khóa ngoại được sử dụng đúng cách trong thiết kế cơ sở dữ liệu.

Ngôn ngữ SQL có một cú pháp rất khác nhau và tôi chia sẻ kinh nghiệm của bạn rằng việc viết các bước trộn dữ liệu bằng cách sử dụng bảng dữ liệu hoặc cú pháp dplyr ngắn hơn. Tuy nhiên, đôi khi dữ liệu của bạn quá lớn so với R hoặc bạn cần lưu trữ kết quả trong cơ sở dữ liệu như một phần của công việc bó định kỳ, sẽ yêu cầu mã hóa logic của bạn trong SQL.

Theo kinh nghiệm của tôi, có những trường hợp sử dụng cụ thể cho SQL và R / Python. SQL rất tốt để lưu trữ dữ liệu quan trọng trong kinh doanh và cho phép nhiều người truy cập, sửa đổi, chèn và xóa dữ liệu trong một môi trường tập trung. Đối với bất kỳ dữ liệu một lần nào, R và Python đều tuyệt vời. Nếu việc trộn dữ liệu của bạn cần được thực hiện định kỳ, bạn sẽ cần chuyển tập lệnh R / Python sang SQL.


3

Chúng thậm chí không thể so sánh, thực sự. SQL là ngôn ngữ dùng để truy cập dữ liệu, R là ngôn ngữ dùng để làm việc với dữ liệu.

SQL không phải là một công cụ hiệu quả để xử lý vì rất khó để thấy các bước trung gian và khi nó gặp lỗi, không có khả năng giải quyết biểu mẫu / chất lượng / cấu trúc dữ liệu của bạn.

Quy trình làm việc của tôi thường là:

  1. Nhận dữ liệu thô từ truy vấn SQL (tính bằng R)
  2. Xây dựng thói quen munging
  3. Nếu có thể, hãy viết lại truy vấn SQL để thực hiện munging tôi đã hoàn thành trong R

Cũng nhận ra rằng không phải tất cả người tiêu dùng dữ liệu đều sử dụng R, nhưng nhiều người vẫn giao tiếp với nền tảng lựa chọn của họ với dữ liệu bằng SQL.


1
Đây là quy trình tương tự mà tôi tuân theo (không thích người giám sát của tôi). Tôi đồng ý rằng việc thực hiện các nhiệm vụ trộn phức tạp như nhiệm vụ tôi mô tả ở trên dường như được thực hiện hiệu quả hơn rất nhiều trong một ngôn ngữ như R. (Đánh giá cao sự khẳng định). Nhưng nếu mục đích duy nhất của SQL là trở thành một ổ cứng khổng lồ cho dữ liệu của bạn, tại sao không có máy chủ R? Dường như tất cả các chức năng (ánh xạ, thiết lập các khóa để liên kết các bảng, nhóm và nối dữ liệu) giờ đây có thể được thực hiện rất hiệu quả trong R. Bảng SQL có hiệu quả hơn về mặt sử dụng bộ nhớ so với khung dữ liệu R không?
AffableAmbler

1
@ Không vì tất cả mọi người sử dụng R.
HEITZ

2

thư viện (dbplyr) có cách tiếp cận đúng: viết mọi thứ bằng R (sử dụng tidyverse) và để thư viện ngay lập tức "biên dịch" mã R thành SQL cấp thấp.

Vì không phải tất cả các munging đều có thể dịch được, nên một cách tiếp cận khác được thực hiện bởi SQL Server: hãy để các đoạn mã R được gọi từ các lệnh "select" của SQL.


1

Cách tiếp cận 1., 2., 3. được đề cập bởi HEITZ theo kinh nghiệm của tôi có thể mở rộng với một giải pháp thay thế cho 3. nơi bạn ghi dữ liệu của mình từ R (data.table) trở lại vào MySQL.

Vì vậy, các bước đầy đủ là MySQL-> data.table-> MySQL

Nếu bạn đảm bảo bạn sử dụng cú pháp data.table, nơi bạn không sao chép DT cũng thân thiện với RAM.


1

Trong một từ KHÔNG . SQL là một cách ngắn gọn và linh hoạt mạnh mẽ để mô tả và tóm tắt dữ liệu bán cấu trúc và thậm chí không cấu trúc - khi một lớp trình thông dịch thích hợp được đặt trên nó. Bằng cách sqlnày được coi là gần như phải có cho các nhà khoa học dữ liệu.

SQL là một cách ngắn gọn và mạnh mẽ để thực hiện các hoạt động cốt lõi của nó là:

  • các phép chiếu ( chọn ..)
  • lọc ( trong đó ..)
  • nhóm / lọc ( nhóm theo )
  • tập hợp cơ bản ( đếm , tổng , avg ..)
  • tham gia

Sức mạnh thực sự đến khi kết hợp các kết quả bằng cách sử dụng các khung nhìn nội tuyến . Khi tôi cần phải làm điều đó, tôi sẽ sử dụng một trong sqldf, pandasql, pysparkSql/ sparkSqlhoặc kết nối rdbms trực tiếp. Viết như vậy theo cách ngắn gọn nhất có thể với data.table(tốt hơn nhiều so data.frame) hoặc datatable(tốt hơn pandas) vẫn còn vụng về hơn, nhiều phiền phức hơn hoặc gần như không thể phụ thuộc vào sự phức tạp của các truy vấn đã cố gắng.

Đối với munging dữ liệu : đó là một câu chuyện khác: một số thao tác dễ dàng được thể hiện bằng sql và một số không quá nhiều. Tuy nhiên, khi bạn kết hợp UDFs, có một vĩ độ rộng hơn của những gì có thể đạt được. Nhiệm vụ hiện tại của tôi bao gồm một số UDFs để thực hiện những việc như hoạt động giao nhau của khách hàng , tập hợp tùy chỉnh và phương pháp tính điểm tùy chỉnh .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.