Giới thiệu ggsql: Trực quan hóa dữ liệu ngay trong câu lệnh SQL

20 tháng 4, 2026·8 phút đọc

Posit đã công bố phiên bản alpha của ggsql, một công cụ triển khai Grammar of Graphics dựa trên cú pháp SQL, cho phép người dùng tạo biểu đồ trực tiếp trong các truy vấn dữ liệu. Công cụ này hướng tới những nhà phân tích làm việc chủ yếu với SQL, mang lại hiệu suất cao và khả năng tích hợp an toàn với các tác nhân AI.

Giới thiệu ggsql: Trực quan hóa dữ liệu ngay trong câu lệnh SQL

Hôm nay, chúng tôi rất hào hứng thông báo về sự ra mắt của phiên bản alpha ggsql. Như tên gọi gợi ý, ggsql là một bản triển khai "Grammar of Graphics" (Ngữ pháp đồ họa) dựa trên cú pháp SQL, mang đến khả năng trực quan hóa dữ liệu phong phú và có cấu trúc cao ngay trong ngôn ngữ truy vấn này. Công cụ hiện đã sẵn sàng để sử dụng trên các nền tảng như Quarto, Jupyter notebooks, Positron và VS Code.

Bài viết này sẽ đi sâu vào lý do tại sao chúng tôi phát triển công cụ này, cũng như cung cấp các ví dụ minh họa cụ thể để bạn có thể hình dung được sức mạnh của ggsql.

ggsql là gì?

Trước khi đi vào chi tiết lý do, hãy cùng xem ggsql hoạt động như thế nào thông qua một vài ví dụ thực tế.

Biểu đồ đầu tiên

Để bắt đầu, chúng ta sẽ tạo một biểu đồ phân tán (scatterplot) đơn giản — kiểu "hello world" trong thế giới trực quan hóa — sử dụng bộ dữ liệu penguins có sẵn:

VISUALIZE bill_len AS x, bill_dep AS y FROM ggsql:penguins
DRAW point

Biểu đồ phân tán đơn giản với ggsqlBiểu đồ phân tán đơn giản với ggsql

Cú pháp này khá trực quan. Mặc dù có sự dài dòng đặc trưng của SQL, nhưng điều đó cũng đồng nghĩa với việc bạn có thể đọc to mã nguồn của mình và hiểu ngay nó đang làm gì. Chúng ta có thể phân tích từng dòng như sau:

  • Chúng ta khởi tạo truy vấn trực quan bằng VISUALIZE và cung cấp ánh xạ từ bộ dữ liệu penguins, liên kết x với dữ liệu trong cột bill_len và y với cột bill_dep.
  • Chúng ta vẽ một lớp điểm (point), theo mặc định sẽ sử dụng ánh xạ chúng ta đã định nghĩa ở trên.

Từ nền tảng này, chúng ta có thể mở rộng biểu đồ:

VISUALIZE bill_len AS x, bill_dep AS y, species AS color FROM ggsql:penguins
DRAW point

Chỉ cần thêm một ánh xạ đơn giản, chúng ta đã có các danh mục màu sắc cho biểu đồ. Sự tiến hóa từng bước của mã vẽ biểu đồ là một trong những điểm mạnh lớn nhất của ngữ pháp đồ họa. Không có các kiểu biểu đồ được định sẵn, chỉ có các thành phần mô-đun có thể kết hợp, thêm hoặc bớt. Để làm rõ hơn, hãy thêm một đường hồi quy mượt vào biểu đồ:

VISUALIZE bill_len AS x, bill_dep AS y, species AS color FROM ggsql:penguins
DRAW point
DRAW smooth

Chúng ta thêm một lớp mới trên lớp điểm. Lớp này cũng mượn cùng một ánh xạ với lớp điểm. Vì chúng ta tô màu theo loài, đường mượt sẽ được chia tách cho từng loài.

Một ví dụ hoàn chỉnh

Sau khi đã làm quen với những biểu đồ cơ bản, hãy chuyển sang một ví dụ phức tạp hơn. Ví dụ dưới đây là sự thích hợp từ một biểu đồ được tạo bởi Jack Davison cho TidyTuesday, sử dụng dữ liệu về các phi hành gia.

WITH astronauts AS (
  SELECT * FROM 'astronauts.parquet'
  QUALIFY ROW_NUMBER() OVER (
    PARTITION BY name
    ORDER BY mission_number DESC
  ) = 1
)
SELECT
  *,
  year_of_selection - year_of_birth AS age,
  'Age at selection' AS category
FROM astronauts
UNION ALL
SELECT
  *,
  year_of_mission - year_of_birth AS age,
  'Age at mission' AS category
FROM astronauts
VISUALIZE age AS x, category AS fill
DRAW histogram
SETTING binwidth => 1, position => 'identity'
PLACE rule
SETTING x => (34, 44), linetype => 'dotted'
PLACE text
SETTING
  x => (34, 44, 60),
  y => (66, 49, 20),
  label => (
    'Mean age at selection = 34',
    'Mean age at mission = 44',
    'John Glenn was 77\non his last mission -\nthe oldest person to\ntravel in space!'
  ),
  hjust => 'left',
  vjust => 'top',
  offset => (10, 0)
SCALE fill TO accent
LABEL
  title => 'How old are astronauts on their most recent mission?',
  subtitle => 'Age of astronauts when they were selected and when they were sent on their mission',
  x => 'Age of astronaut (years)',
  fill => null

Biểu đồ histogram phức tạp về độ tuổi phi hành giaBiểu đồ histogram phức tạp về độ tuổi phi hành gia

Ở cấp độ cao nhất, truy vấn này có hai phần: truy vấn SQL và truy vấn trực quan. Phần SQL là bất kỳ thứ gì từ đầu đến mệnh đề VISUALIZE. Đây là SQL tiêu chuẩn và kết quả của nó được chuyển thẳng vào trực quan hóa thay vì được trả về dưới dạng bảng.

Mệnh đề VISUALIZE đánh dấu sự kết thúc của truy vấn SQL và bắt đầu truy vấn trực quan. Nó thiết lập các ánh xạ mặc định cho các lớp tiếp theo. Tiếp theo, mệnh đề DRAW thêm các lớp vào biểu đồ (ở đây là histogram). Mệnh đề PLACE (anh em với DRAW) được sử dụng để chú thích, hoạt động tương tự nhưng không lấy dữ liệu từ bảng mà sử dụng các giá trị dạng ký tự. Cuối cùng, SCALE điều soát cách các giá trị dữ liệu được chuyển đổi thành các giá trị thẩm mỹ (ví dụ: màu sắc), và LABEL cho phép thêm hoặc sửa đổi các nhãn văn bản như tiêu đề.

Tại sao lại là ggsql?

Viết một thư viện trực quan hóa mới từ đầu là một nhiệm vụ lớn. Dưới đây là những lý do chính khiến chúng tôi thực hiện dự án này:

Chào mừng người dùng SQL

Trong khi R và Python chiếm spotlight trong cuộc cách mạng khoa học dữ liệu, SQL vẫn luôn là "ngựa thồ" đáng tin cậy. Có rất nhiều người làm việc với dữ liệu chỉ hoặc chủ yếu bằng SQL. Các lựa chọn trực quan hóa của họ hiện nay thường không tối ưu: xuất dữ liệu sang R/Python (nằm ngoài vùng an toàn của họ), sử dụng công cụ BI dựa trên GUI (hỗ trợ tái tạo kém), hoặc sử dụng các công cụ trực tiếp trong câu lệnh hiện có nhưng chưa đủ mạnh mẽ.

Mục tiêu của chúng tôi là ggsql sẽ có ý nghĩa ngay lập tức với người dùng SQL, tận dụng kỳ vọng của họ về các mệnh đề có thể kết hợp và mang tính khai báo.

Xử lý khai báo, trực quan hóa khai báo

SQL là ngôn ngữ dành riêng cho lĩnh vực (DSL) để thao tác dữ liệu quan hệ, dựa trên đại số quan hệ. Ngữ pháp đồ họa là sự phân giải lý thuyết các khái niệm trực quan hóa thành các phần mô-đun. Cả hai đều định nghĩa một tập hợp các thao tác mô-đun mang tính khai báo, cho phép người dùng kết hợp các thao tác tùy chỉnh mạnh mẽ. Sự tương đồng này khiến SQL và ngữ pháp đồ họa trở thành một cặp đôi hoàn hảo.

Không cần runtime nặng nề

Tại sao việc ggplot2 hay plotnine yêu cầu cài đặt R hay Python lại quan trọng? Một tệp thực thi nhỏ gọn để xử lý trực quan hóa dữ liệu mang lại lợi ích rõ ràng:

  • Nhúng một tệp thực thi nhỏ vào các công cụ khác dễ hơn nhiều so với việc gói R/Python.
  • Phạm vi nhỏ hơn giúp dễ dàng chạy trong môi trường sandbox (cách ly) để ngăn chặn việc thực thi mã độc hại.

Điều này làm cho ggsql trở thành lựa chọn thuyết phục hơn để tích hợp vào các tác nhân AI hỗ trợ phân tích dữ liệu hoặc các công cụ báo cáo mã lệnh.

Hiệu suất tối ưu

Cấu trúc cứng nhắc của ggsql cho phép thực thi toàn bộ đường ống dữ liệu dưới dạng một truy vấn SQL duy nhất trên backend cho mỗi lớp. Điều này có nghĩa là nếu bạn muốn tạo biểu đồ cột cho 10 tỷ giao dịch, bạn chỉ cần lấy các giá trị đếm cho mỗi thanh từ kho dữ liệu của mình, chứ không phải 10 tỷ hàng dữ liệu. Điều này trái ngược với hầu hết các công cụ trực quan hóa khác phải tải toàn bộ dữ liệu về trước khi tính toán.

Hỗ trợ LLM tốt hơn

Các mô hình ngôn ngữ lớn (LLM) đã chứng minh hiệu quả cao trong việc dịch ngôn ngữ tự nhiên sang SQL. Chúng tôi tin rằng chúng cũng có thể hiệu quả tương tự với ggsql. Vì ggsql là một runtime an toàn và nhẹ hơn nhiều so với R hay Python, bạn có thể tự tin hơn khi triển khai các tác nhân lập trình vào môi trường sản xuất.

Tương lai của ggsql

Chúng tôi gọi đây là bản phát hành alpha, nghĩa là công việc vẫn chưa hoàn tất. Một số tính năng chúng tôi muốn thêm trong tương lai bao gồm:

  • Trình ghi (writer) hiệu suất cao mới, được viết từ đầu bằng Rust.
  • Hạ tầng chủ đề (theming infrastructure).
  • Tính tương tác.
  • Quy trình triển khai đầu cuối từ Posit Workbench/Positron đến Connect.
  • Ngôn ngữ server (language server) và trình định dạng mã hoàn chỉnh cho ggsql.
  • Hỗ trợ dữ liệu không gian (spatial data).

Nếu bạn là người dùng hiện tại của ggplot2, đừng lo lắng. Chúng tôi không bỏ lại ggplot2 phía sau. ggplot2 đã rất trưởng thành và ổn định, và chúng tôi sẽ tiếp tục hỗ trợ nó. Chúng tôi hy vọng rằng ggsql có thể áp dụng kinh nghiệm 18 năm phát triển ggplot2 để tạo ra những tính năng mới, từ đó phản hồi và cải tiến cả hai công cụ.

Nếu bạn không thể chờ đợi để tìm hiểu thêm về ggsql và bắt đầu sử dụng nó, hãy truy cập phần Getting started trên trang web của ggsql để biết hướng dẫn cài đặt và hướng dẫn sử dụng.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗