簡體   English   中英

查詢BigQuery嵌套/重復字段

[英]Query BigQuery nested/repeated fields

我是BigQuery(和SQL)的新手,正在嘗試建立一個表,其中每行包含一個message列(字符串)和metadata列(重復)。 我想使用元數據列,以便查詢與某些元數據參數匹配的消息。

例如,我的消息字符串是:

Hi honey, I'm home!

元數據列是描述消息的任意鍵/值對:

{"category": "personal", "message_type": "salutation"}

這將允許我問bigquery:

回到我這有一個所有消息categorypersonal (或message_typepersonal ,等等)

重申一下,對於插入的每個消息行,元數據關鍵字可能會有所不同(例如,新行可能具有favorite_color而不是category的元數據關鍵字)。

這是我為了支持所需的元數據靈活性而提出的模式:

[
{"name": "message", "type": "string", "mode": "required"}
{"name": "metadata", "type": "record", "mode": "repeated", "fields": [ {"name": "key", 
                                                                        "type": "string", 
                                                                        "mode": "required"},
                                                                       {"name": "value", 
                                                                        "type": "string", 
                                                                        "mode": "required"}]}
]

該模式期望每個元數據條目/行都包含稱為key的列和稱為value列。 似乎工作正常。

有趣的是,Bigquery將我的消息行表示為兩行(我猜這被稱為“扁平化”?):

message                 | metadata_key    |    metadata_value
------------------------------------------------------------
Hi honey, I'm home!       category             personal
Hi honey, I'm home!       message_type         salutation

我想出了如何查詢單個元數據值,例如category = personal

SELECT * FROM [table.test] 
WHERE
metadata.key="category" AND metadata.value="personal"

我得到單行:

message                 | metadata_key    |    metadata_value
------------------------------------------------------------
Hi honey, I'm home!       category             personal

這很棒! 但是,我不知道如何構造與多個元數據參數匹配的更復雜的查詢,例如:

取我這有一個所有消息categorypersonalmessage_typesalutation

以下查詢不返回任何內容:

SELECT * FROM [table.test] 
WHERE
metadata.key="category" AND metadata.value="personal" AND
metadata.key="message_type" AND metadata.value="salutation" 

我認為這是因為bigquery將我的單個消息行分為兩行(每個嵌套的元數據行一個)。 顯然,這意味着我的查詢將永遠無法匹配單個行,因為我正在嘗試針對兩個不同的元數據行進行匹配(即,我要求metas.key同時等於兩個不同的值,而元數據.value同時等於不同的值)。 因此,我對如何正確構建查詢感到困惑。

理想情況下,我希望BigQuery返回單個行(我從其開始的原始示例行),因為它滿足了查詢的兩個元數據要求。

我假設我需要GROUP BY,FLATTEN,WITHIN,unflatten等的某種組合。對於這個sql / bigquery新手來說,可能性/結構的組合有些令人生畏。 任何幫助表示贊賞:)

嘗試以下-只是選項之一
它求和了每一行中有多少個“匹配項”,如果全部匹配(在這種情況下為2),它將輸出。

SELECT *, 
SUM((metadata.key="category" AND metadata.value="personal")
 OR (metadata.key="message_type" AND metadata.value="salutation")
) WITHIN RECORD AS check,
FROM [table.test] 
HAVING check = 2

更干凈的版本如下

SELECT * 
FROM [table.test]
OMIT RECORD IF 
SUM((metadata.key="category" AND metadata.value="personal")
 OR (metadata.key="message_type" AND metadata.value="salutation")
) != 2    

暫無
暫無

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

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