在 BigQuery 中查询 Cloud DLP 发现结果

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本页面提供了一些示例查询,可用于分析已导出到 BigQuery 的 Cloud DLP 发现结果。

您可以配置检查作业或作业触发器,以将发现结果保存到 BigQuery。这样,您就可以查询发现结果以进行进一步分析。当发现结果导出到 BigQuery 时,数据会写入新表或现有表。

如需详细了解 Cloud DLP 在检查后可以执行的所有操作,请参阅操作概念主题。

如需详细了解如何运行查询,请参阅以下内容:

如果您配置 BigQuery 表的检查,则可以设置作业或作业触发器,以便导出的发现结果将包含该行的标识符。这样,您就可以将检查结果关联回包含它们的行。

在检查作业或作业触发器中,将以下字段设置为对表中每一行进行唯一标识的列名称(即具有主键的列):

  • 如果您使用的是 Google Cloud Console,请设置标识字段(以英文逗号分隔)字段。
  • 如果您使用的是 DLP API,请设置 identifyingFields 属性。

检查完成后,发现结果将导出到 BigQuery,每个发现结果都将包含您指定的列的相应值。这些值将位于 location.content_locations.record_location.record_key.id_values 字段中。然后,您可以使用这些值将发现结果链接回受检查的 BigQuery 表中的特定行。

查询示例

您可以使用以下示例查询来分析您的结果。您还可以在 Looker Studio 等可视化工具中使用查询。这些查询可帮助您开始查询您的结果数据。

在以下每个查询中,替换以下内容:

  • PROJECT_ID:项目标识符
  • DATASET:BigQuery 数据集名称
  • TABLE_ID:表 ID

选择每个 infoType 的数量

Google Cloud Console

SELECT info_type.name,
COUNT(info_type.name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`
GROUP BY info_type.name
ORDER BY count DESC;

命令行

bq query --use_legacy_sql=false ' SELECT info_type.name,
COUNT(info_type.name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`
GROUP BY info_type.name ORDER BY count DESC;'

按天选择每个 infoType 的数量

Google Cloud Console

SELECT info_type.name, cast(TIMESTAMP_SECONDS(create_time.seconds) as date) as day,
COUNT(locations.container_name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY info_type.name, day
ORDER BY count DESC;

命令行

bq query --use_legacy_sql=false ' SELECT info_type.name,
cast(TIMESTAMP_SECONDS(create_time.seconds) as date) as day,
COUNT(locations.container_name) AS count FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY info_type.name, day ORDER BY count DESC;'

选择每个容器中各个 infoType 的数量

Google Cloud Console

SELECT info_type.name, locations.container_name,
COUNT(locations.container_name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY locations.container_name, info_type.name
ORDER BY count DESC;

命令行

bq query --use_legacy_sql=false ' SELECT info_type.name, locations.container_name,
COUNT(locations.container_name) AS count FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY locations.container_name,info_type.name ORDER BY count DESC;'

选择为表的每一列查找的结果类型

此查询将按列名称对所有发现结果进行分组,旨在处理来自 BigQuery 检查作业的结果。如果您尝试确定给定列的可能类型,此查询会非常有用。您可以通过修改 WHERE 和 HAVING 子句来调整设置。例如,如果发现结果表中包含多个表结果,您可以将其限制为仅包含一个作业运行或一个表名称。

Google Cloud Console

SELECT
  table_counts.field_name,
  STRING_AGG( CONCAT(" ",table_counts.name," [count: ",CAST(table_counts.count_total AS String),"]")
  ORDER BY
    table_counts.count_total DESC) AS infoTypes
FROM (
  SELECT
    locations.record_location.field_id.name AS field_name,
    info_type.name,
    COUNT(*) AS count_total
  FROM
    `PROJECT_ID.DATASET.TABLE_ID`,
    UNNEST(location.content_locations) AS locations
  WHERE
    (likelihood = 'LIKELY'
      OR likelihood = 'VERY_LIKELY'
      OR likelihood = 'POSSIBLE')
  GROUP BY
    locations.record_location.field_id.name,
    info_type.name
  HAVING
    count_total>200 ) AS table_counts
GROUP BY
  table_counts.field_name
ORDER BY
  table_counts.field_name

上面的查询可能为示例表生成类似这样的结果,其中 infoType 列显示为该指定列找到的每个 infoType 的实例数量。

field_name infoType
field1 CUSTOM_USER_US [count: 7004], CUSTOM_USER_EU [count: 2996]
field2 US_VEHICLE_IDENTIFICATION_NUMBER [count: 9597]
field3 EMAIL_ADDRESS [count: 10000]
field4 IP_ADDRESS [count: 10000]
field5 PHONE_NUMBER [count: 7815]
field6 US_SOCIAL_SECURITY_NUMBER [count: 10000]
field7 CREDIT_CARD_NUMBER [count: 10000]