ネストされたbigqueryjson要素を更新します

AM01

私はこのような大きなクエリスキーマを持っています:

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つの問題があります。

  • セットパーツが機能していません:(
  • (subselect)がスカラー出力を与えていない場合のサブクエリ: '(

どんな助けでも、ポインタは高く評価されます。

DeaconDesperado

UPDATEいくつかの理由でテーブル全体を操作するバッチプロセスとは対照的に、DMLアプローチ()でこれを行うのは困難です(すでにいくつかの理由があります)。

  • 更新が必要なレコード内のサブフィールドは、JSON文字列化されています
  • 更新の性質は、文字列表現のフィールドキーによるフィルターです。
  • レコード自体は、テーブルの最上位で繰り返されるタイプであり、構造体が含まれています

両方のstruct全体を再構築することの位置にあるこのプットあなたhitseventInfoそれを交換するためには、(BigQueryのソートこれと扱い、それを文字列としての盲目のですが、JSONは構造体をエンコード自体はある)一つのフィールドです。

AFAIK BigQueryには、jsonから真のSTRUCTをマーシャルする関数がないため、jsonでエンコードされた列の不要なフィールドを実際に削除する唯一の方法は正規表現である可能性があります。

ここでのWHERE条件は、JSON_EXTRACT_SCALARstandardSQL関数を使用して、削除する特定のキーが実際に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]

編集
0

コメントを追加

0

関連記事

分類Dev

RethinkDBネストされた配列の要素を更新します

分類Dev

D3でネストされたネストされた要素を終了して更新します

分類Dev

ネストされた配列を更新していますが、間違った要素が更新されます

分類Dev

条件付きでmongodbのネストされた要素を更新します

分類Dev

ネストされた配列の要素を不変に更新します

分類Dev

Postgresql-ネストされたjsonb要素から値を更新または削除します

分類Dev

ネストされた配列要素が存在する場合は更新します

分類Dev

最後にネストされた要素を選択します

分類Dev

ネストされた配列の要素を削除します

分類Dev

LINQ toXMLはネストされた要素を抽出します

分類Dev

ネストされた配列マングース内の要素を更新しています

分類Dev

ネストされたJsonNodeの値を更新します

分類Dev

mongodbjavaのネストされた配列値を更新します

分類Dev

深くネストされた配列mongodbを更新します

分類Dev

this.setStateのネストされた配列を更新します

分類Dev

mongodbのネストされた値を更新します

分類Dev

arrayFiltersでネストされた配列を更新します

分類Dev

Angularfireネストされたデータを更新します

分類Dev

ネストされたreactredux状態を更新します

分類Dev

mongodbのネストされた配列を更新します

分類Dev

MongoDBでネストされた配列を更新します

分類Dev

ネストされたリストの要素の長さを取得します

分類Dev

親の<html>要素にネストされた<html>要素を取得します

分類Dev

jQueryはネストされた要素から要素属性を取得します

分類Dev

ReactsetStateでネストされた配列要素を更新する

分類Dev

Pythonでネストされたタプルの2番目のネストされた要素を削除します

分類Dev

ネストされたリストの最初の要素を選択します

分類Dev

任意のネストされたリストから要素を取得します

分類Dev

ネストされたリストのdouble要素を削除します

Related 関連記事

  1. 1

    RethinkDBネストされた配列の要素を更新します

  2. 2

    D3でネストされたネストされた要素を終了して更新します

  3. 3

    ネストされた配列を更新していますが、間違った要素が更新されます

  4. 4

    条件付きでmongodbのネストされた要素を更新します

  5. 5

    ネストされた配列の要素を不変に更新します

  6. 6

    Postgresql-ネストされたjsonb要素から値を更新または削除します

  7. 7

    ネストされた配列要素が存在する場合は更新します

  8. 8

    最後にネストされた要素を選択します

  9. 9

    ネストされた配列の要素を削除します

  10. 10

    LINQ toXMLはネストされた要素を抽出します

  11. 11

    ネストされた配列マングース内の要素を更新しています

  12. 12

    ネストされたJsonNodeの値を更新します

  13. 13

    mongodbjavaのネストされた配列値を更新します

  14. 14

    深くネストされた配列mongodbを更新します

  15. 15

    this.setStateのネストされた配列を更新します

  16. 16

    mongodbのネストされた値を更新します

  17. 17

    arrayFiltersでネストされた配列を更新します

  18. 18

    Angularfireネストされたデータを更新します

  19. 19

    ネストされたreactredux状態を更新します

  20. 20

    mongodbのネストされた配列を更新します

  21. 21

    MongoDBでネストされた配列を更新します

  22. 22

    ネストされたリストの要素の長さを取得します

  23. 23

    親の<html>要素にネストされた<html>要素を取得します

  24. 24

    jQueryはネストされた要素から要素属性を取得します

  25. 25

    ReactsetStateでネストされた配列要素を更新する

  26. 26

    Pythonでネストされたタプルの2番目のネストされた要素を削除します

  27. 27

    ネストされたリストの最初の要素を選択します

  28. 28

    任意のネストされたリストから要素を取得します

  29. 29

    ネストされたリストのdouble要素を削除します

ホットタグ

アーカイブ