如何使用 Data Catalog 进行搜索

本文档介绍了如何使用 Data Catalog 搜索数据资源,例如:

  • BigQuery 数据集、表、视图和模型
  • Pub/Sub 数据流
  • Dataproc Metastore 服务、数据库和表
  • Data Catalog 标记模板、条目组和自定义条目
  • 与 Data Catalog 关联的企业数据孤岛中的资源

搜索范围

如果用户拥有不同的权限,搜索结果可能会有所不同。 Data Catalog 搜索结果根据用户的 IAM 角色和权限进行限定。

例如,如果用户拥有某个对象的 BigQuery 元数据读取权,则该对象会显示在其 Data Catalog 搜索结果中。如需搜索表,您需要拥有该表的 bigquery.tables.get 权限。如需搜索数据集,您需要拥有该数据集的 bigquery.tables.get 权限。BigQuery Metadata Viewer 角色 (roles/bigquery.metadataViewer) 包含要在搜索结果中显示的数据集、表或视图所需的最低元数据读取权限。

相同的访问逻辑适用于当前支持的所有系统,例如 Pub/Sub 和 Data Catalog 本身。

日期分片表

Data Catalog 将日期分片表聚合为单个逻辑条目。此条目的架构与具有最新日期的表分片相同,并包含分片总数的聚合信息。条目的访问权限级来自其所属的数据集。仅当用户有权访问包含这些逻辑条目的数据集时,Data Catalog 搜索才会显示这些逻辑条目。Data Catalog 搜索中不会显示单个日期分片表,即使它们存在于 Data Catalog 中并且可以标记也是如此。

如何搜索数据资源

控制台

  1. 您可以在 Google Cloud Console 的 Data Catalog 首页中搜索数据资源。您还可以从“数据资源”和“搜索提示”面板中进行选择以过滤搜索。

  2. 当您点击搜索或从 Data Catalog 首页中的“数据资源”和“搜索提示”面板中进行选择时,将打开“搜索”页面。如果您在首页上进行了数据资源或搜索提示选择,则会被转到“类型”面板或搜索框表达式,以使您的搜索符合要求。

  3. 您可以通过点击搜索栏下方的数据类型框并选择要搜索的类型来过滤特定数据资产类型。

    示例:要列出公共出租车行程数据集,选择数据集类型,在搜索框中输入“行程”,然后点击搜索。确保选中包括公共数据集,以显示这些结果:

  4. 您可以在搜索框中为搜索字词添加 keyword:value 来过滤搜索:

    关键字说明
    name: 匹配数据资源名称
    column: 匹配列名称或嵌套列名称
    description: 匹配表的说明

  5. 您可以通过给搜索框中的搜索字词添加以下标记关键字前缀来执行标记搜索:

    标记说明
    tag:project-name.tag_template_name 匹配标记名称
    tag:project-name.tag_template_name.key 匹配标记键
    tag:project-name.tag_template_name.key:value 匹配标记 key:string value

控制台(包含过滤条件)

  1. 如需搜索数据资源,请打开 Google Cloud Console 中的 Data Catalog 首页,然后输入搜索查询。
  2. 当您点击搜索或从 Cloud Data Catalog 首页的探索数据资源搜索提示面板中进行选择时,将打开“搜索”页面。如果已从该首页的面板中进行选择,则会被转到搜索框表达式,以使您的搜索符合要求。
  3. 您还可以从左侧的过滤条件面板中进行选择,以过滤搜索结果。

过滤

借助过滤条件,您可以缩小搜索结果的范围。所有过滤条件分组为各个部分:

  • 系统,例如 BigQuery、Pub/Sub、Dataproc Metastore、自定义系统和 Data Catalog 本身。

  • 数据类型,例如数据流、数据集、条目组、文件集、模型、表、标记模板、视图、服务、数据库和自定义类型。
  • 项目,列出您可以使用的所有项目。
  • 标记,列出您可以使用的所有标记模板。
  • 数据集,来自 BigQuery。

标记部分显示过滤依据的标记模板。选定模板会对带有使用所选模板的标记的数据资源进行过滤。如果没有条目包含此类标记,则即使原始搜索查询可能与某些条目匹配,所有搜索结果也会被排除。

标记之外的其他所有过滤条件集都会根据搜索查询更改进行刷新。过滤条件是使用当前搜索结果的示例填充的。因此,整个搜索结果集中可能包含与当前查询匹配的条目,但与这些条目对应的过滤条件可能不会显示在过滤条件面板上。

您可以手动添加以下过滤条件:

  • 项目中,添加项目过滤条件,方法是点击添加项目按钮,搜索特定项目,选择该项目,然后点击打开
  • 标记中,添加标记模板过滤条件,方法是点击添加更多标记下拉列表,搜索特定模板,选择该模板,然后点击确定

此外,您还可以:

  • 勾选包括公共数据集,以搜索 Google Cloud 中公开提供的数据资源以及您可以使用的资源。
  • 点击右上角的相应按钮,切换回旧版搜索体验。旧版体验提供了更简单的过滤功能。

搜索示例

例如,我们搜索您在标记表快速入门中设置的“trips”表:

  1. 在搜索框中输入“trips”,然后点击搜索
  2. 系统部分中选择 BigQuery,以排除属于其他系统的同名数据资源。
  3. 项目部分中选择您的项目 ID,以排除其他项目中的数据资源。如果您的项目未显示在该部分中,请点击添加项目,并在对话框窗口中选择该项目。
  4. 标记部分中选择演示标记模板 (Demo Tag Template),以查看使用此模板的标记是否已附加到“trips”表中。如果此模板未显示在该部分中,请点击添加更多标记下拉列表,找到并选择该模板,然后点击确定

通过所有选定的过滤条件,搜索结果应只包含一个条目,即您的项目中的 BigQuery“trips”表,并附加了使用“演示标记模板”(Demo Tag Template) 的标记:

Python

"""This application demonstrates how to perform search operations with the
Cloud Data Catalog API.

For more information, see the README.md under /datacatalog and the
documentation at https://cloud.google.com/data-catalog/docs.
"""

import argparse

def search(organization_id, search_string):
    """Searches Data Catalog entries for a given organization."""
    from google.cloud import datacatalog_v1

    datacatalog = datacatalog_v1.DataCatalogClient()

    scope = datacatalog_v1.types.SearchCatalogRequest.Scope()
    scope.include_org_ids.append(organization_id)

    # Alternatively, search using project scopes.
    # scope.include_project_ids.append("my_project_id")

    return datacatalog.search_catalog(
        scope=scope,
        query=search_string)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter
    )

    parser.add_argument('organization_id',
                        help='Your Google Cloud organization ID')
    parser.add_argument('query', help='Your custom query')

    args = parser.parse_args()

    search_results = None

    if args.query:
        search_results = search(args.organization_id, args.query)
    else:
        raise Exception('Please provide valid search input.')

    for result in search_results:
        print(result)

Java

/*
This application demonstrates how to perform search operations with the
Cloud Data Catalog API.

For more information, see the README.md under /datacatalog and the
documentation at https://cloud.google.com/data-catalog/docs.
*/

package com.example.datacatalog;

import com.google.cloud.datacatalog.v1.SearchCatalogRequest;
import com.google.cloud.datacatalog.v1.SearchCatalogRequest.Scope;
import com.google.cloud.datacatalog.v1.SearchCatalogResult;
import com.google.cloud.datacatalog.v1.DataCatalogClient;
import com.google.cloud.datacatalog.v1.DataCatalogClient.SearchCatalogPagedResponse;

public class SearchCatalog {

  public static void searchCatalog() {
    // TODO(developer): Replace these variables before running the sample.
    String orgId = "111111000000";
    String query = "type=dataset";
    searchCatalog(orgId, query);
  }

  /**
   * Search Data Catalog entries for a given organization.
   *
   * @param orgId The organization ID to which the search will be scoped, e.g. '111111000000'.
   * @param query The query, e.g. 'type:dataset'.
   */
  public static void searchCatalog(String orgId, String query) {
    // Create a scope object setting search boundaries to the given organization.
    Scope scope = Scope.newBuilder().addIncludeOrgIds(orgId).build();

    // Alternatively, search using project scopes.
    // Scope scope = Scope.newBuilder().addAllIncludeProjectIds("my-project").build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DataCatalogClient dataCatalogClient = DataCatalogClient.create()) {

      // Search the catalog.
      SearchCatalogRequest searchCatalogRequest =
          SearchCatalogRequest.newBuilder().setScope(scope).setQuery(query).build();
      SearchCatalogPagedResponse response = dataCatalogClient.searchCatalog(searchCatalogRequest);

      System.out.println("Search results:");
      for (SearchCatalogResult result : response.iterateAll()) {
        System.out.println(result);
      }

    } catch (Exception e) {
      System.out.print("Error during SearchCatalog:\n" + e.toString());
    }
  }
}

Node.js

// This application demonstrates how to perform search operations with the
// Cloud Data Catalog API.

async function search() {

  // -------------------------------
  // Import required modules.
  // -------------------------------
  const { DataCatalogClient } = require('@google-cloud/datacatalog').v1;
  const datacatalog = new DataCatalogClient();

  // -------------------------------
  // Set your Google Cloud Organization ID.
  // -------------------------------
  // TODO: Replace your organization ID in the next line.
  const organizationId = 111111000000;

  // -------------------------------
  // Set your custom query.
  // -------------------------------
  // TODO: If applicable, edit the query string in the next line.
  const query = 'type=dataset'

  // Create request.
  const scope = {
    includeOrgIds: [organizationId],
    // Alternatively, search using project scopes.
    // includeProjectIds: ['my-project'],
  };

  const request = {
    scope: scope,
    query: query,
  };

  const [result] = await datacatalog.searchCatalog(request);
  return result;
}

search().then(response => { console.log(response) });

REST 和命令行

如果您无法使用针对您的语言的 Cloud 客户端库或者您想要使用 REST 请求来测试 API,请参阅以下示例并参阅 Data Catalog REST API 文档。

1.搜索目录

在使用下面的请求数据之前,请先进行以下替换:

HTTP 方法和网址:

POST https://datacatalog.googleapis.com/v1/catalog:search

请求 JSON 正文:

{
  "query":"trips",
  "scope":{
    "includeOrgIds":[
      "organization-id"
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "results":[
    {
      "searchResultType":"ENTRY",
      "searchResultSubtype":"entry.table",
"relativeResourceName":"projects/project-id/locations/US/entryGroups/@bigquery/entries/entry1-id",
      "linkedResource":"//bigquery.googleapis.com/projects/project-id/datasets/demo_dataset/tables/taxi_trips"
    },
    {
      "searchResultType":"ENTRY",
      "searchResultSubtype":"entry.table",
      "relativeResourceName":"projects/project-id/locations/US/entryGroups/@bigquery/entries/entry2-id",
      "linkedResource":"//bigquery.googleapis.com/projects/project-id/datasets/demo_dataset/tables/tlc_yellow_trips_2018"
    }
  ]
}