1. 程式人生 > >JSON to Insights:快速而簡單

JSON to Insights:快速而簡單

有很多JSON資料集,然後是JSON資料集。每個公司,包括您的公司,都在JSON中儲存了大量資料 - 調查,活動和論壇的結果。

有許多方法可以讓面板成為JSON。您可以為每個報告編寫Python程式,您可以進行視覺化。或者,您可以使用(SQL for JSON)生成正確的演算法  來分析JSON資料。在本文中,我們將向您展示如何使用N1QL快速提取洞察力。我們還使用了下一版本中的兩個功能:公用表表達式(CTE)和視窗函式。

目標:將公共JSON資料集用於美國公開賽高爾夫比分,以建立簡單的排行榜,排名等。

你要做的三件事:

  1. 輕鬆將資料提取到Couchbase中。

  2. 立即開始獲取此JSON資料的值。

  3. 塑造JSON以快速使用新功能生成有用的報告。

來源資料:https//github.com/jackschultz/usopen

此帖子中的查詢也可在以下網址獲得:https//github.com/keshavmr/usopen-golf-queries

資料倉庫結構:此GitHub 倉庫https://github.com/jackschultz/usopen包含US Open golf -2018資料。對於每個洞,它作為每天的單獨檔案。

每個文件都有這種結構。這是第1天第1洞的檔案。提交的Ps有玩家列表,每個玩家都有一個唯一的ID。

每個玩家的遊戲統計資料都是按行程劃分的。

使用玩家的場唯一ID將玩家與得分相匹配。

開始獲取見解:

在開始查詢之前,請在儲存桶上建立主索引。

在usopen上建立主要指數;

任務1:按輪次和最終總數建立球員得分報告。

在自下而上使用JSON後,我們想出了這個查詢。解釋是在查詢之後。

表格結果(以表格形式,來自Couchbase查詢工作臺)

與AS(
  選擇
    pl .hnum  AS holedn,
    pl .ps .Nat  AS country,
    (pl .ps .FN || “” || pl .ps .LN)AS名稱,
    pl .ps .ID  AS ID,
    array_length(hps .Sks)AS得分,
    HPL .hole  AS `hole`,
    HPL 。天 AS `day`
  從
    (
      選擇
        meta(usopen).id  AS hnum,
        PS
      從
        usopen USE鍵“孔:1:1”不需要Ps AS ps
    )pl
    INNER JOIN(
      選擇
        TONUMBER(分裂(間(usopen).ID,“:”)[ 1 ])AS `hole`,
        TONUMBER(分裂(間(usopen).ID,“:”)[ 2 ])AS `day`,
        HPS
      從
        usopen不需要Rs AS rs UNNEST rs .Hs  AS hs UNNEST hs.HPs  AS hps
    )hpl ON(pl .ps .ID = hps .ID)
選擇
  d .name,
  和(
    例如d .day = 1那麼d。得分 ELSE 0 END
  )R1,
  和(
    例如d .day = 2那麼d。得分 ELSE 0 END
  )R2,
  和(
    例如d .day = 3那麼d。分數 ELSE 0 END
  )R3,
  和(
    例如,d .day = 4那麼d。分數 ELSE 0 END
  )R4,
  SUM(d .score)T
  d
GROUP  BY
  d .name
ORDER  BY
  d .name


讓我們逐塊檢視查詢。

看看WITH d子句。該宣告將JSON從PER-day-PER-hole-by-shot-data資料解碼為簡單的標量值。

  • Holedn是文件金鑰 - 空洞日數

  • 國家是球員的國籍

  • ID是玩家的唯一ID。

洞和日是顯而易見的,得分是該洞的球員得分。

在SELECT語句的FROM子句中,pl是從第一天的第一個洞(孔:1:1)中取出的文件的完整列表。

Rs是球員的結果,一杆一杆地射門。首先,我們不需要那個陣列來計算每個洞的細節和那個洞的得分,由array_length(hps.Sks)決定。

一旦我們獲得了逐洞分數,就可以很容易地將最終查詢寫入由玩家和白天進行聚合。

** WITH子句是即將釋出的Mad-Hatter版本中的公用表表達式(CTE)功能。在Couchbase 5.5或更低版本中執行此操作的舊方法是使用LET子句。如果您需要幫助,請在Couchbase論壇中釋出問題)。

任務2:現在,建立完整的排行榜並新增資訊。被削減的高爾夫球手不會參加第三輪或第四輪比賽。我們使用這些資訊來確定被裁掉的球員。

查詢2.獲取上一個查詢並將其命名為公用表dx,然後新增以下表達式以確定該剪下。

這是完整的查詢:

與dy AS(
  選擇
    pl .hnum  AS holedn,
    pl .ps .Nat  AS country,(pl .ps .FN || “” || pl .ps .LN)AS名稱,
    pl .ps .ID  AS ID,
    array_length(hps .Sks)AS得分,
    HPL .hole  AS `hole`,
    HPL 。天 AS `day`
  從
    (
      選擇
        meta(usopen).id  AS hnum,
        PS
      從
        usopen USE鍵“孔:1:1”不需要Ps AS ps
    )pl
    INNER JOIN(
      選擇
        TONUMBER(分裂(間(usopen).ID,“:”)[ 1 ])AS `hole`,
        TONUMBER(分裂(間(usopen).ID,“:”)[ 2 ])AS `day`,
        HPS
      從
        usopen不需要Rs AS rs 不需要.Hs  AS hs 不需要hs.HPs  AS hps
    )hpl ON(pl .ps .ID = hps .ID)
dx AS(
  選擇
    d .name,
    和(
      例如d .day = 1那麼d。得分 ELSE 0 END
    )R1,
    和(
      例如d .day = 2那麼d。得分 ELSE 0 END
    )R2,
    和(
      例如d .day = 3那麼d。分數 ELSE 0 END
    )R3,
    和(
      例如,d .day = 4那麼d。分數 ELSE 0 END
    )R4,
    sum(d .score)T
  從
    dy AS d
  GROUP  BY
    d .name
  ORDER  BY
    d .name
選擇
  d2 .name,
  d2 .R 1,
  d2 .R 2,
  d2 .R 3,
  d2 .R 4,
  d2 .T,(
    情況何時(
      d2 .R 1 = 0
      或者 d2 .R 2 = 0
      或者 d2 .R 3 = 0
      或者 d2 .R 4 = 0
    )那麼“削減”就會失敗
  )AS CUT
  dx AS d2
ORDER  BY
  削減ASC,
  d2 .T  ASC

任務3:確定獲勝者。

我們需要根據總得分對玩家進行排名,以確定誰贏得了比賽。如果分數中存在關聯,則跳過排名。