2012-05-12 43 views
6

Giả sử rằng tôi theo dõi một 'sự kiện' mà người dùng thực trên một trang web, các sự kiện có thể có những điều như:Tính toán phân tích kênh, bạn tính toán kênh như thế nào?

  1. trang web xem
  2. mục thêm vào giỏ hàng
  3. thanh toán
  4. trả cho đơn đặt hàng

Hiện tại, mỗi sự kiện trong số đó được lưu trữ trong cơ sở dữ liệu như:

session_id EVENT_NAME CREATED_DATE ..

Vì vậy, bây giờ tôi muốn xây dựng một báo cáo để hiển thị một cái phễu đặc biệt mà tôi sẽ xác định như sau:

Step#1 event_n 
Step#2 event_n2 
Step#3 event_n3 

Vì vậy, phễu đặc biệt này có 3 bước, và mỗi bước có liên quan đến bất kỳ sự kiện .

Tôi làm cách nào để có thể tạo báo cáo cho dữ liệu này ngay bây giờ cho các dữ liệu ở trên?

Lưu ý: chỉ muốn rõ ràng, tôi muốn có thể tạo bất kỳ kênh nào mà tôi xác định và có thể tạo báo cáo cho kênh đó.

Cách cơ bản nhất mà tôi có thể nghĩ đến là:

  1. nhận được tất cả các sự kiện cho mỗi bước tôi có trong cơ sở dữ liệu của tôi
  2. bướC# 1 sẽ được, x% số người thực hiện event_n
  3. Bây giờ tôi sẽ phải truy vấn dữ liệu cho bướC# 2 người C ALNG đã thực hiện bướC# 1 và hiển thị%
  4. Tương tự như # 3 nhưng đối với bướC# 3 với điều kiện cho bướC# 2

Tôi tò mò về cách các dịch vụ trực tuyến này có thể hiển thị các loại báo cáo này trong môi trường Saas được lưu trữ. Bản đồ-giảm làm cho điều này dễ dàng hơn bằng cách nào đó?

+0

Bạn cũng có thể nhận tất cả các sự kiện trên mỗi ID phiên trong bộ giảm tốc nếu bạn nghĩ điều này giúp dễ dàng hơn. –

Trả lời

2

Vấn đề cốt lõi theo cách bạn đang nghĩ về điều này là bạn đang suy nghĩ trong một mô hình kiểu bảng/SQL. Mỗi sự kiện là một bản ghi. Một trong những điều tốt đẹp về công nghệ NoSQL (mà bạn cảm thấy một mực hướng tới) là bạn có thể lưu trữ bản ghi một cách tự nhiên dưới dạng một phiên cho mỗi bản ghi. Khi bạn lưu trữ dữ liệu theo cách dựa trên phiên, bạn có thể viết một thường trình kiểm tra xem phiên đó có tuân thủ mẫu đó hay không. Không cần phải tham gia hoặc bất cứ điều gì, chỉ là một vòng lặp trên một danh sách các giao dịch trong một phiên. Đó là sức mạnh của dữ liệu bán cấu trúc.

Điều gì xảy ra nếu bạn lưu trữ phiên của mình lại với nhau? Sau đó, tất cả những gì bạn phải làm là lặp qua từng phiên và xem liệu nó có phù hợp hay không.

Đây là trường hợp sử dụng tuyệt vời cho HBase, theo ý kiến ​​của tôi.

Với HBase, bạn lưu trữ ID phiên làm khóa hàng, sau đó mỗi sự kiện dưới dạng giá trị có dấu thời gian làm vòng loại cột. Nội dung bạn để lại là dữ liệu được nhóm lại với nhau theo ID phiên, sau đó được sắp xếp theo thời gian.

Ok, vì vậy bây giờ bạn muốn tìm hiểu xem% phiên đã ban hành hành vi 1, sau đó 2, sau đó 3. Bạn chạy công việc MapReduce trên dữ liệu này.Công việc MapReduce sẽ cung cấp cho bạn một phiên cho mỗi cặp khóa/giá trị hàng. Viết một vòng lặp trên dữ liệu để kiểm tra xem nó có khớp với mẫu không. Nếu nó tính + 1, nếu không, thì không.


Nếu không dùng hết HBase, bạn có thể sử dụng MapReduce để phiên dữ liệu chưa được tổ chức của bạn ở trạng thái nghỉ. Nhóm theo ID phiên, sau đó trong trình giảm tốc, bạn sẽ có tất cả các sự kiện được liên kết với phiên đó được nhóm lại với nhau. Bây giờ, về cơ bản bạn đang ở đâu với HBase, nơi bạn có thể viết một phương thức trong bộ giảm tốc để kiểm tra mẫu.


HBase có thể quá mức nếu bạn không có số lượng dữ liệu vô lý. Bất kỳ loại cơ sở dữ liệu nào có thể lưu trữ dữ liệu theo thứ bậc sẽ tốt trong tình huống này. MongoDB, Cassandra, Redis tất cả đến tâm trí và có điểm mạnh và điểm yếu của họ.

+0

Không chắc chắn liệu tôi có rõ ràng hay không, nhưng điều tôi muốn là để người dùng có thể xác định kênh (các bước và sự kiện phù hợp trên mỗi bước) và có thể xem báo cáo về dữ liệu lịch sử. Tôi đoán điều này có nghĩa là tôi sẽ phải chạy công việc hàng loạt để kéo dữ liệu cũ vào kho dữ liệu/cấu trúc đã cho đúng không? không có cách kỳ diệu nào quanh cái này phải không? – Blankman

+0

Tôi chỉ đang đọc trên cơ sở, và tôi thích cách tôi có thể lưu trữ dữ liệu liên quan theo cách được nhóm như vậy ... Làm thế nào tôi có thể làm điều gì đó tương tự với mongodb? (HBase có thể là quá nhiều đối với tôi tại thời điểm này) – Blankman

+0

Bạn sẽ phải viết một số loại quy trình để đưa chúng lại với nhau hoặc nếu bạn đang sử dụng một cửa hàng dữ liệu lưu trữ dữ liệu như vậy, bạn chỉ có thể sửa đổi các bản ghi. Nếu bạn đang làm người dùng, không phải phiên, chỉ nhóm bởi người dùng thay vì id phiên. –

7

Trước câu trả lời, sử dụng SQL tiêu chuẩn, được đưa ra giả thuyết của bạn: có một bảng SỰ KIỆN với một bố cục đơn giản:

EVENTS 
----------------------------- 
SESION_ID , EVENT_NAME , TMST 

Để có được phiên thực hiện bướC# 1 tại một số thời gian:

-- QUERY 1 
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID; 

Ở đây tôi giả định rằng event1 có thể xảy ra sau đó một lần mỗi phiên. Kết quả là một danh sách các phiên duy nhất đã chứng minh event1 tại một thời điểm nào đó.

Để có được bước 2 và step3, tôi chỉ có thể làm như vậy:

-- QUERY 2 
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID; 
-- QUERY 3 
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event3' GROUP BY SESSION_ID; 

Bây giờ, bạn muốn chọn phiên thực hiện bước 1, bước 2 và step3 - theo thứ tự đó. Chính xác hơn, bạn cần đếm các phiên thực hiện bước 1, sau đó đếm phiên thực hiện bước 2, sau đó đếm số phiên thực hiện bước 3. Về cơ bản chúng tôi chỉ cần kết hợp 3 trên các truy vấn với trái tham gia vào danh sách các phiên vào phễu và những bước họ thực hiện:

-- FUNNEL FOR S1/S2/S3 
SELECT 
    SESSION_ID, 
    Q1.TMST IS NOT NULL AS PERFORMED_STEP1, 
    Q2.TMST IS NOT NULL AS PERFORMED_STEP2, 
    Q3.TMST IS NOT NULL AS PERFORMED_STEP3 
FROM 
    -- QUERY 1 
    (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID) AS Q1, 
LEFT JOIN 
    -- QUERY 2 
    (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q2, 
LEFT JOIN 
    -- QUERY 3 
    (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q3 
-- Q2 & Q3 
ON Q2.SESSION_ID=Q3.SESSION_ID AND Q2.TMST<Q3.TMST 
-- Q1 & Q2 
ON Q1.SESSION_ID=Q2.SESSION_ID AND Q1.TMST<Q2.TMST 

Kết quả là một danh sách các phiên duy nhất người tham gia kênh ở bước 1, và có thể tiếp tục bước 2 và step3 ... ví dụ:

SESSION_ID_1,TRUE,TRUE,TRUE 
SESSION_ID_2,TRUE,TRUE,FALSE 
SESSION_ID_3,TRUE,FALSE,FALSE 
... 

Bây giờ chúng ta chỉ cần phải tính toán một số số liệu thống kê, ví dụ:

SELECT 
    STEP1_COUNT, 
    STEP1_COUNT-STEP2_COUNT AS EXIT_AFTER_STEP1, 
    STEP2_COUNT*100.0/STEP1_COUNT AS PERCENTAGE_TO_STEP2, 
    STEP2_COUNT-STEP3_COUNT AS EXIT_AFTER_STEP2, 
    STEP3_COUNT*100.0/STEP2_COUNT AS PERCENTAGE_TO_STEP3, 
    STEP3_COUNT*100.0/STEP1_COUNT AS COMPLETION_RATE 
FROM 
(-- QUERY TO COUNT session at each step 
    SELECT 
    SUM(CASE WHEN PERFORMED_STEP1 THEN 1 ELSE 0 END) AS STEP1_COUNT, 
    SUM(CASE WHEN PERFORMED_STEP2 THEN 1 ELSE 0 END) AS STEP2_COUNT, 
    SUM(CASE WHEN PERFORMED_STEP3 THEN 1 ELSE 0 END) AS STEP3_COUNT 
    FROM 
    [... insert the funnel query here ...] 
) AS COMPUTE_STEPS 

Et voilà!

Bây giờ để thảo luận. Điểm đầu tiên, kết quả là khá đơn giản cho bạn sử dụng cách suy nghĩ "thiết lập" (hoặc chức năng) chứ không phải cách tiếp cận "thủ tục". Đừng hình dung cơ sở dữ liệu như một tập hợp các bảng cố định với các cột và các hàng ... đây là cách nó được thực hiện, nhưng nó không phải là cách bạn tương tác với nó. Đó là tất cả các bộ, và bạn có thể sắp xếp các bộ như cách bạn cần!

Điểm thứ hai mà truy vấn sẽ tự động được tối ưu hóa để chạy song song nếu bạn đang sử dụng cơ sở dữ liệu MPP chẳng hạn. Bạn thậm chí không cần phải lập trình truy vấn một cách khác nhau, sử dụng map-reduce hoặc bất cứ điều gì ... Tôi chạy cùng một truy vấn trên bộ dữ liệu thử nghiệm của mình với hơn 100 triệu sự kiện và nhận kết quả tính bằng giây.

Cuối cùng nhưng không kém phần quan trọng, truy vấn mở ra khả năng vô tận.Chỉ cần nhóm theo kết quả của người giới thiệu, từ khóa, trang đích, thông tin người dùng và phân tích cung cấp tỷ lệ hội tụ tốt nhất chẳng hạn!

+0

Tôi nghĩ truy vấn này có thể có vấn đề, ví dụ nếu tôi muốn biết ai đã làm: E1, E2, E3 và tôi có phiên với E2, E1, E2, E3 tôi tin rằng truy vấn trên sẽ thất bại (vì nó chỉ xem xét lần xuất hiện đầu tiên của sự kiện) – shaylevi2

+0

Thực ra là không. Ràng buộc duy nhất trong truy vấn ban đầu là E1 E2 => E3 nhưng điều đó sẽ cần phải đếm sự kiện trong một phiên đầu tiên (có thể dễ dàng thực hiện với chức năng cửa sổ) – SergeFantino

0

Gần đây tôi phát hành một mã nguồn mở Hive UDF để làm điều này: hive-funnel-udf

Nó khá đơn giản để sử dụng cho loại nhiệm vụ phân tích phễu, bạn chỉ có thể viết Hive, không cần phải viết tùy chỉnh mã Java MapReduce.

Điều này sẽ chỉ hoạt động nếu bạn đang sử dụng Hive/Hadoop để lưu trữ và truy vấn dữ liệu của bạn.

+2

Vui lòng không đăng [câu trả lời trùng lặp] (// meta.stackexchange.com/a/211726/206345). Thay vào đó, hãy xem xét các hành động khác có thể giúp người dùng trong tương lai tìm thấy câu trả lời họ cần, như được mô tả trong bài đăng được liên kết. – Mogsdad

Các vấn đề liên quan