如何通过ODBC连接对BigQuery进行查询?

4

希望能够通过ODBC使用BigQuery。我已经通过ODBC使用MySQL,这将使我能够将BigQuery作为我的大数据表的MySQL替代品。

1个回答

7
Simba是ODBC方面的专家(他们为几乎所有你能想到的数据源提供ODBC驱动程序),已经为BigQuery构建了一个ODBC连接器。你可以从BigQuery第三方工具页面(在页面底部滚动)免费下载它(适用于Windows)。如果你想使用Linux,你可以直接从Simba这里下载ODBC驱动程序。请注意,如果你从他们的网站下载,Simba会收费。他们的驱动程序可能更加更新并包含支持。
值得注意的一个特点是,Simba驱动程序具有将标准SQL-92兼容的SQL转换为BigQUery SQL方言的能力。如果你想将其用作关系数据库的替代品,则此功能非常有用。但是,如果你想使用BigQuery的全部功能(嵌套数据,洗牌JOIN / GROUP BY等),则应该关闭此开关以直接发送查询。
一旦你安装了BigQuery ODBC驱动程序并创建了DSN(请参阅Simba ODBC文档以获取逐步指南),你就可以开始进行ODBC查询了。以下是一个C#代码示例,可以连接到BigQuery,运行简单查询并打印结果。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Odbc;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BigQueryE2E
{
  /** 
   * Helper class to build an ODBC Connection to connect to a Simba 
   * BigQuery ODBC Driver.
   */
  class ConnectionBuilder {
    private String Dsn;
    private String Catalog;
    private String ExecCatalog;
    private bool UseNativeQuery;

    public ConnectionBuilder SetDsn(String dsn) { 
      Dsn = dsn; 
      return this; 
    }
    public ConnectionBuilder SetCatalog(String catalog) {
      Catalog = catalog; 
      return this; 
    }
    public ConnectionBuilder SetBillingCatalog(String catalog) {
      ExecCatalog = catalog;
      return this;
    }
    public ConnectionBuilder SetUseNativeQuery(bool nativeQuery) {
      UseNativeQuery = nativeQuery;
      return this;
    }

    public OdbcConnection Build() {
      if (Catalog == null || Dsn == null) {
        throw new ArgumentException("Missing required Connection setting");
      }

      StringBuilder connectionString = new StringBuilder();

      connectionString.AppendFormat("DSN={0}; Catalog={1};", Dsn, Catalog);
      if (ExecCatalog != null) {
        connectionString.AppendFormat("ExecCatalog={0};", ExecCatalog);
      }
      if (UseNativeQuery) {
        connectionString.Append("UseNativeQuery=1");
      }

      OdbcConnection conn = new OdbcConnection();
      conn.ConnectionString = connectionString.ToString();
      return conn;
    }
  }

  class Program {
    private static String Query = 
        "SELECT corpus, SUM(word_count) " + 
        "FROM samples.shakespeare " +
        "GROUP BY corpus";

    private static void PrintResults(OdbcDataReader reader) {
      for (int ii = 0; ii < reader.FieldCount; ii += 1) {
        System.Console.Write("{0}{1}",
            reader.GetName(ii),
            ii + 1 < reader.FieldCount ? "\t" : "\n");
      }
      while (reader.Read()) {
        for (int ii = 0; ii < reader.FieldCount; ii += 1) {
          System.Console.Write("{0}{1}",
              reader.GetValue(ii),
              ii + 1 < reader.FieldCount ? "\t" : "\n");
        }
      }
    }
    static void Main(string[] args) {
      OdbcConnection connection = new ConnectionBuilder()
          .SetDsn("bigquery1")
          .SetCatalog("publicdata")
          .SetBillingCatalog("bigquery-e2e")
          .Build();
      try {
        connection.Open();
        using (OdbcCommand command =  connection.CreateCommand()) {
          command.CommandText = Query;
          using (OdbcDataReader reader = command.ExecuteReader()) {
            PrintResults(reader);
          }
        }
      } catch (Exception ex) {
        System.Console.WriteLine("Error {0}: {1}",
          connection.State != ConnectionState.Open 
              ? "opening connection" : "executing query",
          ex);
      } finally {
        connection.Close();
      }
      System.Console.ReadKey();
    }
  }
}

你知道驱动的免费版本是否支持MS SQL链接服务器,还是只支持新的SIMBA版本吗? - hoggkm
免费版本好像已经没了? - Cilvic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接