[英]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函數來查詢它們,並結合使用強制轉換為MAP
和UNNEST
來扁平化結構。
實現我認為您要嘗試的一種方法是:
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.