Upsert dữ liệu vào BigQuery bằng Lark Anycross: để BigQuery làm việc nặng, Anycross chỉ đi lịch

👤Nguyễn Ngô Thượng
📅
⏱️3 phút đọc
Chia sẻ:

Khi đồng bộ dữ liệu lên BigQuery bằng Lark Anycross, bạn sẽ sớm gặp một bức tường nhỏ: Anycross không có sẵn action "upsert" cho BigQuery. Trong danh sách action chỉ có Create Row, Run Query và mấy thao tác đọc — không có cái nút nào ghi "update nếu đã tồn tại, insert nếu chưa".

Cách nhiều người làm là build toàn bộ logic kiểm tra trùng/cập nhật ngay trên Anycross: lấy dữ liệu cũ về, so sánh, rẽ nhánh, rồi quyết định insert hay update. Chạy được, nhưng tốn tài nguyên Anycross và mỗi lần đổi nghiệp vụ là phải sửa lại cả luồng.

Có một cách gọn hơn.

Ý tưởng: dùng bảng tạm + Run Query để BigQuery tự upsert

Thay vì bắt Anycross "suy nghĩ", hãy để BigQuery làm phần khó. Luồng gồm 3 bước:

  1. Đẩy dữ liệu mới vào một bảng tạm (staging). Mỗi lần có dữ liệu mới, Anycross chỉ việc Insert nguyên cụm vào một bảng bộ nhớ tạm theo schema đã định sẵn — không kiểm tra gì cả.
  2. Chạy một câu query đã set sẵn (Run Query). Câu query này dùng MERGE để upsert từ bảng tạm vào bảng chính: trùng key thì update, chưa có thì insert.
  3. Dọn bảng tạm (nếu cần) để lần sau sạch sẽ.

Mấu chốt: toàn bộ logic upsert nằm trong câu SQL chạy trên BigQuery, không nằm trên Anycross. Anycross chỉ còn vai trò "đi lịch" — đến giờ thì trigger luồng chạy tự động.

Câu MERGE trông như thế nào

BigQuery hỗ trợ MERGE chuẩn — đây chính là "upsert" mà Anycross thiếu:

MERGE `project.dataset.bang_chinh` AS t
USING `project.dataset.bang_tam` AS s
ON t.id = s.id
WHEN MATCHED THEN
  UPDATE SET t.ten = s.ten, t.doanh_thu = s.doanh_thu, t.updated_at = s.updated_at
WHEN NOT MATCHED THEN
  INSERT (id, ten, doanh_thu, updated_at)
  VALUES (s.id, s.ten, s.doanh_thu, s.updated_at);

Bạn set sẵn câu này trong action Run Query của Anycross. Mỗi lần luồng chạy, nó chỉ gọi đúng câu query đó — không cần build lại logic.

Vì sao cách này tốt hơn

  • Tiết kiệm tài nguyên Anycross. Anycross không phải kéo dữ liệu cũ về để so sánh; nó chỉ insert thô rồi gọi 1 query.
  • Setup nhanh và linh động hơn. Đổi nghiệp vụ chỉ cần sửa câu SQL, không phải vẽ lại nhánh luồng.
  • Logic tập trung một chỗ. Quy tắc update/insert nằm gọn trong câu MERGE — dễ đọc, dễ kiểm soát, dễ bàn giao.

Khi nào nên (và không nên) dùng

Dùng khi bạn đồng bộ định kỳ một lượng dữ liệu vừa phải vào BigQuery và muốn idempotent (chạy lại không tạo bản ghi trùng) — ví dụ sync đơn hàng, số liệu vận hành theo ngày.

Cân nhắc cách khác nếu bạn cần ghi realtime từng bản ghi với độ trễ cực thấp, hoặc khối lượng quá lớn cần streaming insert — lúc đó bài toán đã khác.


Đây là kiểu trade-off tôi hay áp dụng: hiểu công cụ thiếu gì, rồi đẩy việc nặng về đúng nơi làm tốt nhất — thay vì cố nhồi mọi thứ vào một chỗ. Cùng tư duy đó, tôi viết riêng về cách dựng chấm công – tính lương – xin nghỉ trên Larksuite cho SME.

Nếu bạn đang có dữ liệu rời rạc cần gom về một nơi và tự cập nhật, xem thêm một vài hệ thống tôi đã làm cho SME hoặc đặt lịch trao đổi 15 phút. Cần làm trọn gói automation/data pipeline cho doanh nghiệp? Đó là dịch vụ của Diginno — công ty tôi sáng lập.

Bài viết hữu ích?

Chia sẻ để nhiều người biết đến!

Chia sẻ:

📚 Bài viết liên quan

Khám phá thêm những bài viết cùng chủ đề với Upsert dữ liệu vào BigQuery bằng Lark Anycross: để BigQuery làm việc nặng, Anycross chỉ đi lịch

💡 Bài viết hữu ích? Hãy kết nối với tôi!

Đặt lịch tư vấn miễn phí để trao đổi cụ thể về data, automation và AI cho doanh nghiệp của bạn.