簡體   English   中英

雅典娜/普雷斯托:復雜的結構/陣列

[英]Athena/Presto : complex structure/array

認為我在這里問不可能的事,但把它扔出去。 嘗試在Athena中查詢一些json。 我正在使用的數據如下所示(摘錄)

condition={
        "foranyvalue:stringlike":{"s3:prefix":["lala","hehe"]},
        "forallvalues:stringlike":{"s3:prefix":["apples","bananas"]
}

..我需要到這里: 在此處輸入圖片說明

加上:密鑰名稱不固定,因此有一天我可能會得到:

condition={"something not seen before":{"surprise":["haha","hoho"]}}

最后一點,我希望將其視為一個數組,並首先將“ foranyvalue”和“ forallvalues”部分拆分為單獨的行。 但所有內容都用{}括起來,它拒絕嵌套。

但是,盡管上述計划失敗了,但仍感激收到以任何方式解決此問題的任何提示!

謝謝

如果您的JSON數據沒有易於描述的架構,則可以使用STRING作為列的類型,然后使用Athena / Presto的JSON函數來查詢它們,並結合使用強制轉換為MAPUNNEST來扁平化結構。

實現我認為您要嘗試的一種方法是:

WITH the_table AS (
  SELECT CAST(condition AS MAP(VARCHAR, JSON)) AS condition
  FROM (
    VALUES
    (JSON '{"foranyvalue:stringlike":{"s3:prefix":["lala","hehe"]},"forallvalues:stringlike":{"s3:prefix":["apples","bananas"]}}'),
    (JSON '{"something not seen before":{"surprise":["haha","hoho"]}}')
  ) AS t (condition)
),
first_flattening AS (
  SELECT 
    SPLIT(first_level_key, ':', 2) AS first_level_key,
    CAST(first_level_value AS MAP(VARCHAR, JSON)) AS first_level_value
  FROM the_table
  CROSS JOIN UNNEST (condition) AS t (first_level_key, first_level_value)
),
second_flattening AS (
  SELECT
    first_level_key,
    second_level_key,
    second_level_value
  FROM first_flattening
  CROSS JOIN UNNEST (first_level_value) AS t (second_level_key, second_level_value)
)
SELECT
 first_level_key[1] AS "for",
 TRY(first_level_key[2]) AS condition,
 second_level_key AS "left",
 second_level_value AS "right"
FROM second_flattening

我已經在第一個CTE中包含了您作為內聯VALUES列表給出的兩個示例,以及在表聲明中到底要做什么(即要使用的列的類型)以及在查詢中要做什么處理(即強制類型轉換) )取決於您的數據以及您希望/如何設置表格。 因人而異。

該查詢通過幾個單獨的步驟展平JSON結構,首先展平第一級鍵和值,然后展平內部文檔的鍵和值。 一步就可以做到,但至少要兩步才能做到,使閱讀起來更容易。

由於第一級鍵並不總是帶有冒號,因此我使用TRY來確保訪問第二個值不會破壞任何內容。 您可能會更早過濾掉沒有冒號的值,並避免這種情況,因為您對它們不感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM