Ingest Pancake: nguồn lấy về bằng api
Trong các loại dữ liệu phổ biển của doanh nghiệp việt nam thì pancake là ông tổ của các loại dữ liệu về cs chăm sóc khách hàng. Chúng ta không thể dương mắt nhìn đống data này chỉ có thể view trên web pancake.vn được. Chúng ta phải mang nó về xào qua các lượt và kết hợp nó với dữ liệu từ các nguồn khác của công ty để cho ra được những dashboard, những insight đẹp nhất.
Vì thế blog này ra đời ko chỉ vì lưu trữ kiến thức mà còn là vì nó vô cùng cần thiết, công ty nào mà chả phải có kênh chăm sóc khách hàng, mà đã ở Việt Nam thì kiểu gì cũng phải dùng pancake. Và công ty thể nào cũng bảo ae lấy đống data này về.
Về cách lấy trên trang chủ api docs của pancake đã nêu rất rõ cho từng loại dữ liệu. Bài viết dưới đây tôi chỉ gộp tất cả các nguồn lại và có thêm lấy gộp tất cả các bảng theo từng file và theo ngày. Có cả code sample trên lambda functions.
Rồi. Vào việc thôi !
Introduction
Cách lấy: sử dụng thư viện request trong python gửi một request thông api với các tham số được yêu cầu từ tài liệu: [link], mỗi lượt request sẽ trả về 1 đoạn json tương ứng
- Xử lý dữ liệu khi lấy: xóa header, format lại dữ liệu theo dòng mỗi bản ghi là 1 dòng tương ứng.
- Đối với các bảng đặc biệt như Users statatistics cần phải tách riêng 2 phần: user và user_statatistics do có 2 phần trong data lấy về.
- Các bảng khác
- Xử lý chuyển từng mã nhân viên vào trong data tương ứng để glue có thể format chuẩn.
hình minh họa: đưa id của nhân viên vào trong để tạo thành 1 record đẹp (Xử lý tại raw data để về sau đưa data lên athena đỡ phức tạp và dễ dàng scale khi số lượng nhân viên tăng lên)
Các bảng lấy về kèm api, tham số tương ứng
- ads: data quảng cáo hằng ngày (thường thì chả thấy ads đâu 🙂)
- campaign: cái này 1 năm có khi có 1 campaign nên data ít thậm chí nhiều app ko có
- conversations: dữ liệu hội thoại của khách hàng
- engagement_statistics: bảng này phải tách ra làm 2 bảng và lưu thành engagement_statistics và user_enggements để glue có thể hiểu và formate đúng, xử lý luôn để sau đỡ phức tạp.
Cách tách
1 | data = response.json() |
- new_customer_statistics: thống kê khách hàng mới
- page_customers: dữ liệu khách hàng theo trang (khách hàng tương tác với 1 trang nhất định)
- posts: thông tin về các bài đăng trên trang
- tags: lấy về 1 lần do ko có tham số ngày tháng trong api (lưu các thẻ (tags) được sử dụng để phân loại nội dung)
- user_list: danh sách người quản lý trang (lấy về 1 lần do ko có tham số ngày tháng)
- user_statistics: thống kê về người dùng, bao gồm các thông tin liên quan đến hoạt động hoặc tương tác của họ trên hệ thống
- user: thông tin cơ bản về user
- users_engagements: thông tin về mức độ tương tác của người dùng với các nội dung trên hệ thống
Các lỗi gặp phải: phần lớn là do sai định dạng ngày (phải theo đúng chuẩn tài liệu của pancake
- Sửa bằng cách viết lại một hàm để convert lại định dạng đúng của nó (hiện tại trong code đang có 2 hàm vì từng api lại yêu cầu định dạng ngày khác)
- Để ngày sai: dữ liệu có từ 9/2023 (trước đó data toàn null với 0)
Để format lại được dữ liệu được gọn và theo dòng thì phải thông qua hàm lưu data vào s3 sau (ý tưởng là data request về là 1 cục, cục đó đi qua hàm save_to_s3 để xử lý thành mỗi record trên 1 dòng.
1 | def save_to_s3(data, filename, app_name, data_type): |
bằng việc sử dụng hàm lưu file thì dữ liệu được lưu thành các dòng đẹp đẽ
Sau khi làm ổn các bước trên thì chuyển sang viết lambda function: Ý tưởng là chỉ cần viết lại y trang code trên local rồi chuyển các hàm thực hiện chính (lambda_handler)
Các giải thích về việc tổ chức dữ liệu trong datalake
- Dữ liệu pancake được lưu vào folder pancake
- Tổ chức dữ liệu theo dự án, pancake/
/table/file_ .json - Dữ liệu lịch sử được lấy về sẽ ko có đuôi ngày ở sau
- Các ngày lấy về sau thì đặt tên file + ngày
- Các dữ liệu về tag, user_list sẽ chỉ lấy 1 lần, đã comment trong code
- Chỉnh lấy dữ liệu lịch sử ngay trong code lambda được do có chuyền vào tham số ngày … to ngày ….
Hàm lambdafunction đầy đủ:
1 | # đang daily trươc 1 ngày |
Hàm lambda handler
1 | def lambda_handler(event, context): |
SUPPORTED ENDPOINTS
HTTP method | Endpoint |
---|---|
GET | List user, static…. |
POST | update |
Status Codes
Mã phản hồi HTTP được sử dụng để chỉ ra các lớp thành công và lỗi chung.
Success Code
HTTP Status Quote | Description |
---|---|
200 | Successfully processed request. |
Error Codes
Phản hồi lỗi chứa nhiều chi tiết hơn về lỗi trong nội dung phản hồi, trong "code"
và "message"
.
HTTP Status Quote | code |
message |
---|---|---|
400 | invalid_json | The request body could not be decoded as JSON |
400 | invalid_request_url | This request URL is not valid. |
400 | invalid_request | This request is not supported. |
401 | unauthorized | The bearer token is not valid. |
403 | forbidden | You do not have permission to access this resource. |
404 | not found | The requested resource could not be found. |
405 | method_not_allowed | The request method is not allowed. |
429 | too_many_requests | You have made too many requests. Please try again later. |
500 | internal_server_error | An error occurred on the server. |
502 | bad_gateway | The server received an invalid response from the upstream server. |
503 | service_unavailable | The server is temporarily unavailable. Please try again later. |
504 | gateway_timeout | The upstream server did not respond in time. |