2014-08-30 17 views
12

Chúng tôi có tài khoản Google Analytics cao cấp, tài khoản này sẽ cấp cho chúng tôi quyền truy cập vào dữ liệu sự kiện cấp hàng. Dữ liệu này được xuất hàng ngày sang Google Bigquery và cho mỗi ngày, một bảng mới sẽ được tạo trong tập dữ liệu.Làm phẳng dữ liệu Google Analytics (với các trường lặp lại) không hoạt động nữa

Cho đến một tuần trước, chúng tôi có thể xuất dữ liệu Google Analytics này sang CSV bằng cách làm phẳng nó thành bảng dàn tạm thời và sau đó xuất nó sang CSV. Các truy vấn, chúng tôi sử dụng để làm như vậy là như thế này:

SELECT * FROM 
    flatten([xxxxxxxx.ga_sessions_20140829],hits), 
    flatten([xxxxxxxx.ga_sessions_20140828],hits), 
    flatten([xxxxxxxx.ga_sessions_20140827],hits), 
    flatten([xxxxxxxx.ga_sessions_20140826],hits) 

Hôm qua tôi nhận thấy câu hỏi này ngay bây giờ sẽ ném một lỗi:

Cannot output multiple independently repeated fields at the same time. Found customDimensions_value and hits_product_productSKU 

Rõ ràng một cái gì đó đã thay đổi liên quan đến việc flatten() chức năng, như hits_product_productSKU là con của trường số lần truy cập.

Tôi cũng đã thử một số truy vấn cũ trong lịch sử truy vấn, nhưng chúng cũng bị hỏng. Không có lưu ý phát hành nào đề cập đến bất kỳ thay đổi nào, vậy điều gì đang xảy ra?

Làm cách nào để xuất lại tất cả mọi thứ trong tệp xuất BigQuery của Google Analytics?

+1

Tôi vừa gặp phải sự cố này trên một số truy vấn cũng đã hoạt động tốt.Tôi không thể tìm thấy bất kỳ ghi chú nào về thay đổi, nhưng chắc chắn có ... – NathanS

+1

Điều này rất tồi để Google phá vỡ tính tương thích ngược – Tjorriemorrie

Trả lời

14

Đây thực sự là kết quả của một bugfix tôi nộp vào tuần trước, và đang ngăn cản bạn nhận được kết quả không chính xác.

BigQuery theo mặc định sẽ san phẳng tất cả các kết quả truy vấn trước khi trả về chúng, nhưng chúng tôi chỉ muốn làm phẳng một trường lặp lại độc lập để tránh việc mở rộng dữ liệu sản phẩm chéo. Lỗi là kiểm tra của chúng tôi đối với nhiều trường lặp lại không tính đến độ lặp lại của hồ sơ gốc trong một số trường hợp, khiến chúng tôi thất bại trong việc làm phẳng một số trường lặp lại độc lập. Điều này có nghĩa là chúng ta có thể trả về các hàng phẳng mà các giá trị lặp lại độc lập thực sự được "làm phẳng" thành các giá trị lặp lại phụ thuộc, thay vì tạo ra sản phẩm chéo, đó thực sự là một kết quả sai.

Những gì bạn thấy ở đây là kết quả của việc kiểm tra chặt chẽ hơn: bạn có (ít nhất) hai trường lặp lại trong lược đồ đầu ra của bạn trước khi chúng tôi cố gắng làm phẳng kết quả.

Một điều quan trọng cần lưu ý là hàm FLATTEN ([giá trị bảng], [trường]) chỉ làm phẳng độ lặp lại của trường mà bạn chỉ định làm đối số thứ hai. Khi bạn nói flatten ([xxxxxxxx.ga_sessions_20140829], hits), bạn chỉ làm phẳng các bản ghi "hits". Nếu bạn cũng muốn làm phẳng các con lặp lại của nó (sản phẩm, quảng cáo, v.v.), bạn phải thêm một cách khác rõ ràng cho các trường đó, chẳng hạn như:

FLATTEN (số lần truy cập (xxxxxxxx.ga_sessions_20140829]).sản phẩm)

-

Bạn có một vài tùy chọn để làm ví dụ công việc của bạn:

1) Chọn lĩnh vực ít. Nếu bạn chỉ quan tâm đến việc tạo đầu ra phẳng của một vài trường, bạn có thể xóa các trường lặp lại độc lập khỏi kết quả truy vấn bằng cách chỉ chọn rõ ràng các trường bạn quan tâm.

2) Thêm FLATTEN khác. Bạn sẽ cần phải san bằng trên mỗi trường lặp lại, có vẻ như bao gồm ít nhất là hits, hits.product và customDimensions. Bạn có thể thấy rằng thông báo lỗi sau đó sẽ khiếu nại về các trường lặp lại khác nhau: thêm nhiều FLATTEN trên các trường lặp lại trong lược đồ của bạn cho đến khi nó hoạt động.

+2

Làm thế nào về một hàm flatten_all? Chúng tôi muốn nhập tất cả dữ liệu vào kho dữ liệu của riêng mình, do đó việc lồng ghép 5 truy vấn bằng phẳng trở lên có vẻ hơi khó khăn ... –

+1

Không quan tâm, tại sao không thể 'FLATTEN' lấy một số trường tùy ý để làm phẳng ? ví dụ. 'FLATTEN (bảng, trường1, trường2)' – Mullefa

+0

Công trình này hoạt động. Nó chỉ là rất khó chịu để viết ra tất cả các flattens. Có vẻ như một API tốt hơn có thể theo thứ tự. – fraxture

0

Tôi nghi ngờ các bảng được tạo bởi Google Analytics Premium đã được tăng cường với việc bổ sung các cột mới. Việc thêm cột không phải là vấn đề, trừ khi truy vấn của bạn sử dụng công cụ chọn * và một trong các cột mới xảy ra chứa giá trị lồng nhau.

Giải pháp được đề xuất: Thay vì sử dụng *, hãy yêu cầu rõ ràng các cột bạn cần.

+0

Felipe, trong trường hợp của tôi, tôi không sử dụng GA hoặc bất kỳ lựa chọn nào *. Trong quá khứ, chọn các cột cụ thể sẽ làm phẳng các đối tượng lồng nhau. Dữ liệu được tải từ JSON lồng nhau. Truy vấn mẫu: 'SELECT [datasource_id] AS [datasource_id], [mentions.mentioned_name] AS [mentions_mentioned_name], [links.title] AS [links_title], [links.url] AS [links_url] FROM [data.posts] [ bài viết] ' Lỗi hiện tại của tôi là: Không thể xuất nhiều trường lặp lại độc lập cùng một lúc. Found mentions_mentioned_name và links_title Trong quá khứ, nó sẽ mở rộng các cột rỗng thành null. – NathanS

+0

Id công việc hoặc truy vấn (thất bại) đang hoạt động để điều tra xin vui lòng! –

3

Nếu bạn đang sử dụng BigQuery Web Console, chọn Bảng Destination, nhấp Cho phép kết quả lớn và bỏ chọn Flatten Kết quả.

Nếu bạn đang sử dụng bq công cụ dòng lệnh:

bq query --allow_large_results --noflatten --destination_table NAME_OF_TABLE "SELECT * from FLATTEN([dataset], hits)" 
0

Bạn phải sử dụng làm phẳng truy vấn trước khi kết nối. Đơn giản chỉ cần chọn các lĩnh vực được đề cập trong các lỗi và sử dụng làm phẳng lồng nhau:

SELECT * FROM 
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140829],hits),customDimensions_value),hits_product_productSKU), 
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140828],hits),customDimensions_value),hits_product_productSKU), 
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140827],hits),customDimensions_value),hits_product_productSKU), flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140826],hits),customDimensions_value),hits_product_productSKU) 
1

Đối với những người muốn nhập dữ liệu GA đến một cơ sở dữ liệu quan hệ: Xin lưu ý rằng một schema lồng nhau là thực sự đặt nhiều bảng quan hệ vào một cấu trúc lồng nhau - chúng tương đương nhau, vì vậy phẳng dẹt không phải là giải pháp tốt nhất ở đây: bạn muốn riêng biệt các bảng một lần nữa! Bằng cách đó bạn tiết kiệm rất nhiều dung lượng trong bộ nhớ và các truy vấn của bạn có thể nhanh hơn.

Bạn có thể nghĩ về dữ liệu GA là 3 bảng quan hệ:

  • phiên bảng
  • hit bảng sản phẩm
  • bảng

Để có được bảng phiên bạn có thể sử dụng một cái gì đó giống như

-- session table 
SELECT 
    * EXCEPT(hits, 
    customDimensions), 
    CONCAT('{',(
    SELECT 
     STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"')) 
    FROM 
     t.customdimensions),'}') as customDimensions 
FROM 
    `project.dataset.ga_sessions_20171031` AS t 

CustomDimensions được tổng hợp thành chuỗi json.

Tương tự như vậy với bảng lượt truy cập:

-- hits table 
SELECT 
fullvisitorid, 
visitid, 
visitstarttime, 
h.* EXCEPT(product, 
customdimensions, customMetrics, customVariables, promotion, experiment), 
CONCAT('{',(
    SELECT 
    STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"')) 
    FROM 
    h.customdimensions),'}') AS hitsCustomDimensions, 
CONCAT('{',(
    SELECT STRING_AGG(CONCAT(CAST(index AS string),':',cast(value as string))) 
    FROM h.custommetrics),'}') AS hitsCustomMetrics 
FROM 
`project.dataset.ga_sessions_20171031` AS t, 
t.hits AS h 

Bạn có thể thêm chương trình khuyến mãi và thử nghiệm như tôi đã làm với customDimensions sử dụng một phụ chọn.

Tham gia phiên với hit sử dụng một nối fullVisitorId + visitStartTime/visitId (phiên GA bao gồm nửa đêm chia tay: sử dụng visitStartTime thay vì visitId Nếu bạn muốn bỏ qua nửa đêm chia sử dụng visitId - nó vẫn như cũ bất chấp sự chia rẽ)

Đối với sản phẩm bạn muốn thêm số hit để 'phiên id' của bạn để có được một định danh duy nhất:

-- product table 
SELECT 
    fullvisitorid, 
    visitid, 
    visitstarttime, 
    h.hitNumber, 
    p.* EXCEPT(customdimensions, customMetrics), 
    CONCAT('{',(
    SELECT STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"')) 
    FROM p.customdimensions),'}') AS productsCustomDimensions, 
    CONCAT('{',(
    SELECT STRING_AGG(CONCAT(CAST(index AS string),':',cast(value as string))) 
    FROM p.custommetrics),'}') AS productsCustomMetrics 
FROM 
    `project.dataset.ga_sessions_20171031` AS t, 
    t.hits AS h, h.product as p 

Bây giờ bạn đã 3 quan hệ/bảng "phẳng", bạn có thể tham gia khi cần thiết trong bất kỳ quan hệ db.

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