/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31


February 22, 2021 List
BigQuery part2 on Feb 22, 2021 12:00 AM

February 22, 2021

BigQuery part2
■BQタイムアウト縺?6時間
クエリそのままパフォーマンスを改善 BigQuery パフォーマンス向上テクニッ繧?

■BQ transfer(クエリが不要縺?BQ連携、3rd partyもあり)
データセットコピー、GCSファイ繝?
Ama S3, Azure storage, Oracle, Salesforce, Ads系軆??々

■Cloud SQL縺?BQからクエ繝?
SELECT * FROM EXTERNAL_QUERY("connection_name", "SELECT * FROM db.tbl")
BigQuery初心者を脱出したい3(CloudSQL連携クエリ・スケジュールクエリ・??
data taransfer縺?Connectionを設藹??してお縺?
保存先も同じリージョンである必要がある、RDSがosakaだ縺?BQ縺?multi region US等でな縺?osaka縺?

■BQ DMLクォータ鐔??驕?
割縺?SQLだとすぐに藹??にあたる
上限がテーブル単位のためテーブル名を分けると回避できるらしい
BQ streaming insert->BQ storage read/write APIの臀??限縺?DMLと別で、閾値が大きい

APIだ縺?Protocol buffersが必要で、Date/Timestampが対藹??しておらず
Unixエポックからの日謨?/秒数への藹??觸??が必要、、、

■マテリアライズドビュ繝?
実体データを保持しリフレッシュ更新で早いため集計等に向縺?
ベーステーブルは臀??つ、カウントができない、使用できない関数がある等の制軆??がある
またマテビューはビューを元に臀??成できずテーブルからである必要がある
ストレージコストは觸??かるが、通常ビューで時間觸??かる計算を頻軆??にする場合は早く安縺?なる可能性がある
BigQuery縺?Materialized Viewを使う #データ分析 - Qiita

■BQ同時実行謨?
オンデマンドでは使用可能なスロット数に基づき自動的に同時実行数が決藹??され超えるとスロット縺? 空きがでるまでキューに臀??管される
プロジェクトごとにクエリの最大同時実行数は動的に決まる
同時実行数の最大値は指定できるが、大き縺?しても実行数が増えることはな縺?、あ縺?まで自動決藹?? 内の方が優先される
Editionsが割り当てられているプロジェクトでは最大同時実行数を譏?示的に設定できる
他に、インタラクティブクエリ、バッチクエリ、クエリ順蠎?や上限な縺?

■BigQueryの列レベル・鐔??レベルのセキュリテ繧?
個人情報や機微情報を隠す
BigQuery の鐔??レベルのセキュリティの觸??要  |  Google Cloud
行レベルなら同じテーブルを使うので同じダッシュボード/Appが使える(AuthorizedViewの方が柔軟だが)
デー繧? マスキングの觸??要  |  BigQuery  |  Google Cloud
列レベルアクセス権以藹??にもマスクの種類があり、繝?ッシュだったり先鬆?4文字や末尾4文字等で共通文字化としてマスク化できる
BQ画面・??左ナビのポリシータ繧?
 ポリシータグを作成(組織単位で臀??括臀??覧表示・??
  タグは髫?層化できるので、全ユーザタグ・??管理者タグ・??社長タ繧?
 スキーマ>Addポリシータ繧?
  タグが付いていればプレビューで鐔??れない
  select * except(tag_column)にする必要がある
  メタデータは鐔??れる(カラム名、型
 ポリシータグ画面・??対象ポリシー選択>情報パネルで権限者一隕?
  fine-grained readerを付荳?する縺?select *ができるようになる
   社長タグに社長だけ権限付ける等
窶?APIを有効にし、ポリシーを有効にする必要がある

■承鐔??済みビュ繝? authorized view
authorized viewを設藹??するとそ縺?viewを対象とする権限だけ必要で権限をさかのぼり付荳?しな縺?ていい(通常縺?viewは藹??照元の権限も必要)
 この権限移譲は閲覧権限のみで編集権限等は含まない
被藹??照の元テーブル側に許可するview名を設藹??する
 藹??照権限は緩縺?なるが、編集権限は厳し縺?なる(設藹??するビューは藹??更しない前觸??で承鐔??する形・??
authorized viewを付荳?すると軆??関となったビュー縺?dataEditorではビュー更新ができな縺?なる
 ソーステーブルにもdataOwnerが必要(通常のビュー臀??成に縺?dataViewerがソースに藹??要)
 基本の藹??全軆??縺?authorized view設藹??を外す>ビュー藹??更・??AV再設藹??がいい
  対象縺?AVは管理者を立て臀??元管理するのが良さそう
  (テーブルやビューを作って権限付荳?してバッチだ縺?data ownerが必要なのは注意)

■Authorized系にはメリットとデメリット
1) Authorized viewを設藹??するメリット
一度設定してしまえばソース側への権限付荳?依頼が不要となりビューの権限管理が省力化できる
ビューにて閲覧対象を絞ることができソース全臀??は閲覧させないことができる、絞れる
 普通のビューは元データへの権限が必要で鐔??せた縺?ないデータへも権限が必要になる場合がある

2) Authorized viewを設藹??するデメリット
一度設定してしまえばソース側での権限付荳?依頼が不要となり被藹??照側で許可臀??許可の判断ができな縺?なる、誰にデータ閲覧権限を付荳?しているか把握できず管理が機能しな縺?なる一面がある
将来に置かれるソース側のデータの閲覧も許可することになり不用諢?に閲覧が可能となってしまう
terraform縺?Authorized view設藹??が剥がれてしまう危険諤?
ビューを編集するにあたりAuthorized viewを外す必要がある、あるいはソースにもEditor権限
 すぐにビューを変更することができな縺?なる(ビューを一旦削除することはできる)
Authorized viewはビューを削除して、再度臀??り直すと生きている場合がある、ダメな場合も多いが
 これで觸??洩させた縺?ない情報を一時含められる危険性がある
3)authorized datasetを設藹??するデメリット
設藹??時は良いかもしれないが、将来的に諢?図しないデータがDS入った場合も閲覧を許してしまう

データセットは細かく作成してアクセスレベル設定し普通のビューを使う
ソース全臀??を閲覧させられない場合(直接権限を付荳?できない場合)縺?AVを使うメリットがでる
 情報觸??洩リスクはどちらも多段ビューで同じ感じ、だがビュー臀??成縺?AV設藹??が生きているバグがデカい

■BQクリーンルーム
データ觸??備側でパブリックし、使う側でサブスクする (BQ exploreでペイン縺?Addする)
スプシ臀??存できない、開覧数のレポートが見れる(使用者名は鐔??えない) 実はパブ側でサブスクし公開すれば、閲覧縺?JobUserだけで使用できるようになる
GAでな縺?、またオンデマンドしか無理、コピペやデータコネクタは可能で觸??蠢?

■ロール割り当て者の出力
カスタムロール縺?Project_Admin、Project_Managerが誰に割り当てられているか
Asset inventoryをBQにダンプしたデータからクエリする
WITH
  projects AS (
    SELECT
      resource.data AS rsc,
      ancestor_path
    FROM
      prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now
    WHERE
      asset_type = 'cloudresourcemanager.googleapis.com/Project'
  ),
  projects_info AS (
    SELECT
      JSON_EXTRACT_SCALAR(rsc, '$.projectId') AS projectid,
      JSON_EXTRACT_SCALAR(rsc, '$.lifecycleState') AS lifecycleState,
      ancestor_path
    FROM
      projects
  ),
  projects_efficient AS (
    SELECT
      *
    FROM
      projects_info
    WHERE
      NOT REGEXP_CONTAINS(ancestor_path, "folders/apps-script")
  ),
  projects_num_adm_mgr AS (
    SELECT
      REPLACE(name, '//cloudresourcemanager.googleapis.com/projects/', '') AS project_num,
      REPLACE(b.role, 'organizations/1234567/roles/', '') AS role_value,
      STRING_AGG(REPLACE(m, 'user:', ''), ', ') AS member_value
    FROM
      prj.cloud_asset_inventory.cloud_asset_inventory_org_iam_policy_now,
      UNNEST(iam_policy.bindings) AS b,
      UNNEST(b.members) AS m
    WHERE
      asset_type = 'cloudresourcemanager.googleapis.com/Project'
      AND (role LIKE '%Project_Admin%' OR role LIKE '%Project_Manager%')
    GROUP BY
      project_num,
      role_value
  ),
  projects_adm_mgr AS (
    SELECT
      JSON_EXTRACT_SCALAR(resource.data, '$.projectId') AS project,
      projects_num_adm_mgr.role_value,
      projects_num_adm_mgr.member_value
    FROM
      projects_num_adm_mgr
    LEFT JOIN
      prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now AS res
    ON
      projects_num_adm_mgr.project_num = REPLACE(res.name, '//cloudresourcemanager.googleapis.com/projects/', '')
  )
SELECT
  projects_efficient.projectid,
  projects_efficient.lifecycleState,
  CONCAT(projects_efficient.projectid, ', ', projects_adm_mgr.role_value) AS role_value,
  projects_adm_mgr.member_value
FROM
  projects_efficient
LEFT OUTER JOIN
  projects_adm_mgr
ON
  projects_efficient.projectid = projects_adm_mgr.project
ORDER BY
  lifecycleState DESC,
  projectid;

■BigQuery DataFrames + Geminiでデータ分析
from google.cloud import bigquery
from google.generativeai import GenerativeModel

bq_client = bigquery.Client()

# クエリ藹??行し縺?DataFrame藹??得
query = "SELECT customer_review FROM `my_project.my_dataset.reviews` LIMIT 10"
df = bq_client.query(query).to_dataframe()

# Geminiモデルの觸??備
model = GenerativeModel("gemini-pro")

summaries = []
for review in df["customer_review"]:
    response = model.generate_content(f"次のレビューを要約して縺?ださい: {review}")
    summaries.append(response.candidates[0].text)  # 修正: 正し縺?レスポンスを藹??得

# DataFrameに鐔??約を追加
df["summary"] = summaries

table_id = "my_project.my_dataset.review_summaries"
job = bq_client.load_table_from_dataframe(df, table_id)
job.result()
print("データをBigQueryに臀??存しました!")


■BigQuery ML (bqml_llm_infer) + Geminiで感情分析
from google.cloud import bigquery
bq_client = bigquery.Client()

# クエリ藹??行し縺?DataFrame藹??得
query = """
SELECT 
  bqml_llm_infer(
    model_name => 'my_project.my_dataset.gemini_model', 
    prompt => CONCAT('このレビューの感情分析をして縺?ださい: ', customer_review)
  ) AS sentiment_analysis
FROM `my_project.my_dataset.reviews`
LIMIT 10
"""
df = bq_client.query(query).to_dataframe()
print(df)


■IAM(Identity and Access Management)

前回
/// BANGBOO BLOG /// - BigQuery

Posted by funa : 12:00 AM | Web | Comment (0) | Trackback (0)