第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

BigQuery - 在分區(qū)內(nèi)嵌套操作,以便從具有 170 億條記錄的表中聚合連續(xù)記錄

BigQuery - 在分區(qū)內(nèi)嵌套操作,以便從具有 170 億條記錄的表中聚合連續(xù)記錄

慕慕森 2021-09-14 21:32:45
我對 SQL 和 BigQuery 還很陌生,一周以來一直在努力尋找解決這個問題的可行解決方案。我得到的兩個解決方案不能擴展。背景有一個包含 170 億條記錄的 BigQuery 表。每條記錄代表一個設備 ping。每條記錄都包含時間戳、標識用戶的 ID 以及接收 ping 的位置的名稱。拿這個數(shù)據(jù)表,按ID分區(qū),按時間戳排序。然后你有一組按時間順序排列的 ping。用戶可能對位置 A 進行 1 次 ping,然后對位置 B 進行 7 次 ping,然后對位置 C 進行 2 次 ping,再對 A 進行 2 次 ping。ID        timestamp             LocationABC123    2017-10-12 10:20:37   AABC123    2017-10-12 11:15:21   BABC123    2017-10-12 11:21:47   BABC123    2017-10-12 11:25:05   BABC123    2017-10-12 11:32:12   BABC123    2017-10-12 11:36:24   BABC123    2017-10-12 11:47:13   BABC123    2017-10-12 11:59:08   BABC123    2017-10-12 12:04:42   CABC123    2017-10-12 17:04:52   CABC123    2017-10-12 19:15:37   AABC123    2017-10-12 19:18:37   A我想做的是拿這張桌子制作一個新的,每次“旅行”一行。其中一次旅行是一組連續(xù)的 ping,帶有“first_ping”和“l(fā)ast_ping”列。如果行程包含 1 個 ping,則該時間戳既是第一個 ping 又是最后一個 ping。ID        first_ping            last_ping             LocationABC123    2017-10-12 10:20:37   2017-10-12 10:20:37   AABC123    2017-10-12 11:15:21   2017-10-12 11:59:08   BABC123    2017-10-12 12:04:42   2017-10-12 17:04:52   CABC123    2017-10-12 19:15:37   2017-10-12 19:18:37   A解決方案的嘗試Python我從來沒有處理過這么大的數(shù)據(jù),而且我一直在使用 Python。所以我對解決方案的第一次嘗試是一個 Python 腳本,它:查詢一個ID的所有數(shù)據(jù)的BQ按時間戳對數(shù)據(jù)進行排序使用“位置”上的 diff 函數(shù)來確定它何時發(fā)生變化使用 cumsum() 用相同的值標記每組 ping 的所有項目。在 cumsum() 上使用 df.groupby() 獲取每條記錄的一行,并使用 first() 和 last() 獲取 first_ping 和 last_ping 值。這個解決方案產(chǎn)生了我需要的輸出,但對于 170 億條記錄和 6900 萬個唯一 ID 是不可行的。每個 ID 大約需要 10 秒,即大約 190K 小時的運行時間。問題是否可以使用上述 SQL 方法,但將所有邏輯嵌套在分區(qū)語句中?基本上,按 user_id 進行分區(qū)并在該分區(qū)內(nèi)執(zhí)行所有排序、累計等操作?有沒有更好的方法來解決這個問題?我感謝任何和所有的投入。我完全不知道解決這個問題的最佳方法,并且感覺超出了我的深度。
查看完整描述

2 回答

?
白豬掌柜的

TA貢獻1893條經(jīng)驗 獲得超10個贊

本cumulativeSum應使用來計算累計總和,而不是一個不相等聯(lián)接:


WITH visitWithIsChange AS 

(select

   *,

    CASE 

     WHEN (LAG(location,1,'') 

           OVER (PARTITION BY user_id ORDER BY timestamp)) = location

           THEN 0

           ELSE 1

     END ischange

 FROM `ping_table`

 -- I don't now about BigQuery, but why do you need this?

 --ORDER BY user_id, timestamp

 ),

 visitsWithcumsum AS (

   SELECT 

      *,

      SUM(ischange)

      OVER (PARTITION BY user_id

            ORDER BY timestamp

            ROWS UNBOUNDED PREDECING) AS cumulativeSum 

   FROM visitWithIsChange  

)

SELECT 

  MIN(timestamp) AS first_ping,

  MAX(local_timestamp) AS last_ping,

  user_id,

  chain_id,

FROM visitsWithcumsum

GROUP BY

  user_id,

  cumulativeSum,

  chain_id,

ORDER BY user_id, first_ping


查看完整回答
反對 回復 2021-09-14
  • 2 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號