使用适用于 BigQuery 的 ODBC 驱动程序

适用于 BigQuery 的 Open Database Connectivity (ODBC) 驱动程序可将非 Java 应用连接到 BigQuery,让您能够将 BigQuery 功能与首选工具和基础架构结合使用。如需将 Java 应用连接到 BigQuery,请使用适用于 BigQuery 的 JDBC 驱动程序

适用于 BigQuery 的 ODBC 驱动程序根据 Apache 2.0 许可获得授权。

准备工作

  1. 确保您熟悉 ODBC 驱动程序和驱动程序管理器。

  2. 确保您的操作系统符合以下要求:

    操作系统 支持的架构 最低版本和依赖项
    Windows 32 位 (x86)、64 位 (x64) 版本:Windows 10、Windows Server 2016 或更高版本

    依赖项:Microsoft Visual C++ Redistributable for Visual Studio 2019 或 2022
    macOS 64 位 (x86_64)、ARM64 (Apple Silicon) 版本:macOS 12 (Monterey) 或更高版本

    依赖项:ODBC 驱动程序管理器(例如 unixODBC)。确保将安装目录添加到 DYLD_LIBRARY_PATH
    Linux 64 位 (x86_64) 版本:任何具有 glibc 2.27 或更高版本的发行版(例如,Ubuntu 20.04 LTS+、Debian 11+)

    依赖项:ODBC 驱动程序管理器(例如,unixODBC)。确保将安装目录添加到 LD_LIBRARY_PATH 中。
  3. 向 BigQuery 进行身份验证,并记下以下信息,以便稍后在通过 ODBC 驱动程序与 BigQuery 建立连接时使用。您只需记下与您使用的身份验证方法对应的信息。

    身份验证方法 身份验证信息 示例 连接属性(稍后设置)
    标准服务账号 服务账号密钥(JSON 对象) my-sa-key KeyFilePath
    工作负载身份联合或员工身份联合 外部账号配置文件中的受众群体属性 //iam.googleapis.com/locations/global/... BYOID_AudienceUrl
    令牌检索和环境信息文件 {"file":"/path/to/file"} BYOID_CredentialSource
    用户项目(仅限员工池) my_project BYOID_PoolUserProject
    STS 令牌类型 id_token BYOID_SubjectTokenType
    STS 令牌交换端点 https://sts.googleapis.com/v1/token BYOID_TokenUrl
    应用默认凭证 不适用 不适用

安装和配置 ODBC 驱动程序

您可以使用 Windows 或非 Windows 操作系统来安装和配置适用于 BigQuery 的 ODBC 驱动程序。

Windows

  1. 安装与应用架构对应的驱动程序:

  2. 通过执行以下操作来创建数据源名称 (DSN):

    1. 在 Windows 开始菜单中,前往 ODBC 数据源,然后选择与客户端应用具有相同位数的版本。
    2. ODBC 数据源管理员页面上,点击驱动程序标签页。
    3. 在已安装的 ODBC 驱动程序列表中,找到 ODBC Driver for BigQuery
    4. 选择系统 DSN 标签页可为所有用户创建 DSN,选择用户 DSN 标签页可为当前用户创建 DSN。一般建议使用系统 DSN,因为某些应用会使用不同的用户账号加载数据,可能无法检测到其他用户 DSN。
    5. 点击 Add(添加)。
    6. 创建新数据源对话框中,选择 ODBC Driver for BigQuery,然后点击完成。系统随即会打开 ODBC Driver for BigQuery DSN 设置对话框。
    7. 数据源名称字段中,为 DSN 输入名称。
    8. 添加连接属性。如需查看属性的完整列表,请参阅连接属性

非 Windows 设备

  1. 安装与您的操作系统对应的驱动程序:

  2. 提取下载的 ZIP 或 TAR 文件的内容。

  3. 将 ZIP 或 TAR 文件的内容移动到您要安装连接器的目录。BigQuery 的 ODBC 驱动程序共享对象路径为 INSTALL_DIR/lib/libgoogle_cloud_odbc_bq_driver.so,其中 INSTALL_DIR 是您的安装目录。

  4. 更新 .ini 文件以反映连接器的新路径。

    以下示例更新了 Linux 系统中的 .ini 文件:

    unzip linux_odbc-driver.VERSION.zip -d linux_odbc-driver.VERSION/
    cd ./linux_odbc-driver.VERSION
    export INSTALL_DIR=$(pwd)
    export ODBCINI=$INSTALL_DIR/odbc.ini
    export ODBCINSTINI=$INSTALL_DIR/odbcinst.ini
    export GOOGLEBIGQUERYODBCINI=$INSTALL_DIR/googlebigqueryodbc.ini

    VERSION 替换为驱动程序版本。

建立连接

如需使用适用于 BigQuery 的 ODBC 驱动程序在应用与 BigQuery 之间建立连接,请确定您的连接字符串。如果您已通过 DSN 配置连接属性,则可以跳过此步骤。

连接字符串采用以下格式:

Driver=ODBC Driver for BigQuery;ProjectId=PROJECT_ID;OAuthType=AUTH_TYPE;AUTH_PROPS;OTHER_PROPS

替换以下内容:

  • PROJECT_ID:BigQuery 项目的 ID。
  • AUTH_TYPE:一个数字,用于指定您使用的身份验证类型。选择以下选项之一:
    • 0:用于服务账号身份验证
    • 3:用于应用默认凭据身份验证
    • 4:用于工作负载身份联合或员工身份联合身份验证
  • AUTH_PROPS:您在向 BigQuery 进行身份验证时记下的身份验证信息,以 property_1=value_1; property_2=value_2;... 格式列出,例如 KeyFilePath=my-sa-key(如果您使用服务账号进行身份验证)。
  • OTHER_PROPS(可选):ODBC 驱动程序的其他连接属性,以 property_1=value_1; property_2=value_2;... 格式列出。如需查看连接属性的完整列表,请参阅连接属性

连接属性

ODBC 驱动程序连接属性是指您在建立与数据库的连接时包含在连接字符串中的配置参数。适用于 BigQuery 的 ODBC 驱动程序支持以下连接属性。

连接属性 说明 默认值 数据类型 必需
AdditionalProjects 驱动程序可访问以用于查询和元数据操作的项目,此外还包括通过 ProjectId 属性设置的主项目。 不适用 以逗号分隔的字符串
AllowHtapiForLargeResults 确定驱动程序是否可以使用 BigQuery Storage Read API。 0 布尔值
AllowLargeResults 确定当 QueryDialect 属性设置为 BIG_QUERY 时,驱动程序是否处理大于 128 MB 的查询结果。如果 QueryDialect 属性设置为 SQL,驱动程序将始终处理大型查询结果。 0 布尔值
BYOID_AudienceUrl 包含工作负载身份池或员工池的资源名称以及相应池中的提供方标识符。 不适用 字符串 仅当 OAuthMechanism=4
BYOID_CredentialSource 设置检索令牌本身所需的信息,以及一些环境信息。 不适用 字符串 仅当 OAuthMechanism=4
BYOID_PoolUserProject 当项目是员工身份池而不是 Workload Identity 池时,设置项目。 不适用 字符串 仅当 OAuthMechanism=4 且使用员工池时
BYOID_SubjectTokenType 根据 OAuth 2.0 令牌交换规范设置 STS 令牌类型。预期值包括:
  • urn:ietf:params:oauth:token-type:jwt
  • urn:ietf:params:oauth:token-type:id_token
  • urn:ietf:params:oauth:token-type:saml2
  • urn:ietf:params:aws:token-type:aws4_request
不适用 字符串 仅当 OAuthMechanism=4
BYOID_TokenUrl 设置 STS 令牌交换端点。 https://sts.googleapis.com/v1/token 字符串
DefaultDataset 充当项目中的指定数据集,当您执行查询而不明确指定数据集时,驱动程序会自动引用该数据集。 不适用 字符串
FilterTablesOnDefaultDataset 确定表或列元数据方法返回的元数据的范围。如果为 false,则不进行过滤。您还必须设置 DefaultDataset 属性以启用过滤功能。 FALSE 布尔值
EnableSession 确定连接是否启动会话。启用后,相应连接运行的第一个查询会启动会话,并且驱动程序会将该会话 ID 传递给所有后续查询。 0 布尔值
JobCreationMode 用于启用低延迟查询路径。选择以下任一选项:
  • 1:驱动程序会为每个查询创建作业 (JOB_CREATION_REQUIRED)
  • 2:驱动程序执行查询,但不执行作业 (JOB_CREATION_OPTIONAL)
2 整数
KeyFilePath 使用服务账号身份验证时,服务账号密钥的路径。 不适用 字符串 仅当 OAuthMechanism=0
KMSKeyName 指定在加密和解密数据时要使用的 KMS 密钥的名称。 不适用 字符串
LargeResultsDataSetId 指定用于存储大型查询结果的目标数据集。 不适用 字符串
LargeResultsDatasetExpirationTime 指定大型结果数据集中的所有表的生命周期(以毫秒为单位)。 3600000
Location 指定驱动程序创建或查询数据集的位置。 不适用 字符串
LogLevel 限制驱动程序在互动期间记录的详细信息。选择以下任一选项:
  • 0OFF
  • 1ERROR
  • 2WARNING
  • 3INFO
0 整数
LogPath 指定驱动程序写入日志文件的目录。 不适用 字符串
LogFileCount 指定要保留的日志文件数量上限。 0 整数
LogFileSize 指定每个日志文件的最大大小(以字节为单位)。 0
MaxResults 指定 BigQuery API 结果中每页的结果数。 10000
MaxThreads 定义连接器可在线程池中用于并发处理的线程数量上限。如需将此属性配置为非 Windows 连接器的连接器级设置,请在 googlebigqueryodbc.ini 文件中指定此属性。 8 整数
OAuthMechanism 身份验证类型。选择以下任一选项:
  • 0:服务账号身份验证
  • 3:应用默认凭据身份验证
  • 4:工作负载身份联合或员工身份联合身份验证
不适用 整数
ProjectId 驱动程序的默认项目 ID。驱动程序使用此项目执行查询,并根据资源使用情况向此项目收取费用。 不适用 字符串
ProxyHost 代理服务器的主机名或 IP 地址。 不适用 字符串
ProxyPort 代理服务器正在监听的端口号。 不适用 字符串
ProxyPwd 通过代理服务器连接时用于身份验证的密码。 不适用 字符串
ProxyUid 通过代理服务器连接时用于身份验证的用户名。 不适用 字符串
PrivateServiceConnectUris 用于覆盖默认端点的自定义端点。示例:
  • BIGQUERY=https://bigquery.us-east4.rep.googleapis.com/
  • READ_API=bigquerystorage.us-east4.rep.googleapis.com
  • OAUTH2=oauth2.us-east4.rep.googleapis.com
不适用 以逗号分隔的字符串
QueryDialect 指定要使用的查询方言。使用 SQL 表示 GoogleSQL(强烈推荐),使用 BIG_QUERY 表示旧版 SQL。 SQL 字符串
QueryProperties 配置可修改查询行为的属性。 不适用 Map<String, String>
UniverseDomain 指定组织的 Universe 网域。 googleapis.com 字符串
UseQueryCache 启用 BigQuery 中的查询缓存功能。 true 布尔值

数据类型映射

当您通过适用于 BigQuery 的 ODBC 驱动程序运行查询时,会发生以下数据类型映射:

GoogleSQL 类型 ODBC SQL 类型
INT64SQL_BIGINT
BOOLSQL_BIT
DATESQL_TYPE_DATE
FLOAT64SQL_DOUBLE
TIMESQL_TYPE_TIME
TIMESTAMPSQL_TYPE_TIMESTAMP
DATETIMESQL_TYPE_TIMESTAMP
BYTESSQL_VARBINARY
STRINGSQL_VARCHAR
ARRAYSQL_VARCHAR
STRUCTSQL_VARCHAR
INTERVALSQL_VARCHAR
JSONSQL_VARCHAR
GEOGRAPHYSQL_VARCHAR
RANGESQL_VARCHAR
NUMERICSQL_NUMERIC
BIGNUMERICSQL_NUMERIC

示例

以下示例演示了如何将参数化查询和多语句脚本与 ODBC 驱动程序搭配使用。

参数化查询

// 1. Prepare statement
std::string insert_stmt = "INSERT INTO MyTable VALUES (?, ?, ?)";
status = SQLPrepare(hstmt, (SQLCHAR*)insert_stmt.c_str(), SQL_NTS);

// 2. Bind parameters
std::string str_val = "example_string";
long long int_val = 12345;
double float_val = 1.2345;

// Bind string field
status = SQLBindParameter(
    hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 50, 0,
    (SQLPOINTER)str_val.c_str(), str_val.size(), NULL);

// Bind integer field
status = SQLBindParameter(
    hstmt, 2, SQL_PARAM_INPUT, SQL_C_UBIGINT, SQL_BIGINT, 0, 0,
    &int_val, 0, NULL);

// Bind float field
status = SQLBindParameter(
    hstmt, 3, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0,
    &float_val, 0, NULL);

// 3. Execute statement
status = SQLExecute(hstmt);

多语句脚本

// 1. Prepare and execute the multi-statement script
std::string query =
    "CREATE OR REPLACE TABLE MyTable (StringField STRING, IntegerField INTEGER); "
    "INSERT INTO MyTable VALUES ('example', 123); "
    "SELECT * FROM MyTable;";

status = SQLExecDirect(hstmt, (SQLCHAR*)query.c_str(), SQL_NTS);

// 2. Process results for each statement using SQLMoreResults
do {
    SQLSMALLINT num_cols;
    status = SQLNumResultCols(hstmt, &num_cols);

    if (num_cols > 0) {
        // This is a result-returning statement (e.g., SELECT)
        while (SQLFetch(hstmt) == SQL_SUCCESS) {
            // Process rows...
        }
    } else {
        // This is a non-result statement (e.g., CREATE, INSERT)
        SQLLEN row_count;
        SQLRowCount(hstmt, &row_count);
        // Process affected rows...
    }
} while (SQLMoreResults(hstmt) == SQL_SUCCESS);

价格

您可以免费下载适用于 BigQuery 的 ODBC 驱动程序。 不过,使用该驱动程序时,您需要按标准 BigQuery 分析价格付费。

后续步骤