私はこのような大きなクエリスキーマを持っています:
visitorId INTEGER NULLABLE
visitID INTEGER NULLABLE
hits RECORD REPEATED
hits.eventInfo RECORD NULLABLE
hits.eventInfo.eventCategory STRING NULLABLE
hits.eventInfo.eventLabel STRING NULLABLE
サンプルデータは次のとおりです。
visitorId visitId hits.eventInfo.eventCategory hits.eventInfo.eventCategory
123456 1 abc {"info":"secret", "otherfields":"blah"}
lmn {"info":"secret", "otherfields":"blah"}
xyz {"info":"secret", "otherfields":"blah"}
124557 1 abc {"info":"secret", "otherfields":"blah"}
lmn {"info":"secret", "otherfields":"blah"}
xyz {"info":"secret", "otherfields":"blah"}
eventCategoryが"abc"の場合にのみ、 "info": "secret"を削除する必要があります。
私は大規模な初心者です。何度も叩いてみたところ、これにたどり着くことができましたが、残念ながら今は立ち往生しています。
UPDATE `project.dataset.ga_sessions_20200608`
SET hits = ARRAY(
SELECT AS STRUCT * REPLACE((REGEXP_REPLACE(eventInfo.eventLabel, r"\"info\":\"[a-z A-Z]*\",", "")) AS eventInfo.eventLabel) from UNNEST(hits)
)
WHERE (select eventInfo.eventLabel from UNNEST(hits)) LIKE '%info%'
ここには2つの問題があります。
どんな助けでも、ポインタは高く評価されます。
UPDATE
いくつかの理由でテーブル全体を操作するバッチプロセスとは対照的に、DMLアプローチ()でこれを行うのは困難です(すでにいくつかの理由があります)。
両方のstruct全体を再構築することの位置にあるこのプットあなたhits
とeventInfo
それを交換するためには、(BigQueryのソートこれと扱い、それを文字列としての盲目のですが、JSONは構造体をエンコード自体はある)一つのフィールドです。
AFAIK BigQueryには、jsonから真のSTRUCTをマーシャルする関数がないため、jsonでエンコードされた列の不要なフィールドを実際に削除する唯一の方法は正規表現である可能性があります。
ここでのWHERE条件は、JSON_EXTRACT_SCALAR
standardSQL関数を使用して、削除する特定のキーが実際にjsonに存在するという条件をキャプチャできます。
したがって、考えられる純粋なBigQueryアプローチ(UDFなし)は次のようになります。
#standardSQL
UPDATE
`project.dataset.table_DATE`
SET
--reconstruct hits column as an array
hits = ARRAY(
SELECT
--reconstruct each struct of hits
AS STRUCT * REPLACE( (
SELECT
--reconstruct eventInfo...
AS STRUCT eventInfo.* REPLACE(
--with eventLabel replaced with a filtered version
REGEXP_REPLACE(eventInfo.eventLabel, r"\"secret\":\"[A-Za-z\p{L}]* [A-Za-z\p{L}]*\",", "") AS eventLabel)
) AS eventInfo )
FROM
UNNEST(hits) AS hits )
WHERE
--Only for rows where at least one eventLabel's json contains a `secret` key
EXISTS (SELECT JSON_EXTRACT_SCALAR(h.eventInfo.eventLabel, "$.secret") is not null from unnest(hits) as h)
正規表現は、データの形式に基づいて変更が必要になる場合があることに注意してください。ここでは、可能なユニコード文字(姓名など)を含む2ワードのシークレット値を想定しています。
正規表現の部分はUDFの方が適している可能性がありますが、大きなテーブルの場合は遅くなる可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加