Apache Hive上のテーブルをAccessのリンクテーブルとして登録する方法 [VBA]

木曜日 , 3, 8月 2017 Leave a comment

Apache Hive上に登録されているすべてのテーブルをAccessのリンクテーブルとして一括登録するプログラムです。
前提として、Apache HiveのODBCドライバが導入済み、ODBC接続設定が完了している必要があります。

プログラム実行中に既にAccess上に登録済みのテーブルが出現した場合、リンクテーブルの更新は行わず、処理をスキップします。
更新を必要とする場合は、処理前に該当するAccess上のテーブルを削除してから処理を行ってください。

プログラム中のコメントとしても記述していますが、連続してリンクテーブルの追加処理を行っていると、1802回目の追加処理(TableDefs.Appendの呼び出し)で「実行エラー ‘3146’: ODBC–呼び出しが失敗しました。」というエラーが発生します。
復旧させるためには、いったんAccessを終了させ、Accessを再起動、データベースを開きなおすのがもっとも早いと思います。

Hive用としていますが、ODBC接続できるPostgreSQLやMySQLなどのRDBMSであれば、接続文字列部分のDriver部分に適切な値を変更することでHive以外のデータベースのリンクテーブル登録プログラムとしても使えると思います。

動作確認を行った環境:

Access/Windows

Access 2013 / Windows 10 Pro バージョン:1703 ビルド:15063

ODBCドライバ

Microsoft Hive ODBC Driver 2.01.05.1006 / Hortonworks Hive ODBC Driver 2.01.07.1010

Apache Hadoop

2.8.1

Apache Hive

2.3.0

メタストア

PostgreSQL 9.6.3

ライセンス

NYSL

'

' This software is distributed under the license of NYSL.
' ( http://www.kmonos.net/nysl/ )

Option Explicit
Option Compare Database

' ========================================================================
'
' 指定されたHiveデータベース上のテーブルをAccessのリンクテーブルとして
' 登録するAccess VBAモジュール
'
'
' ※注意
'   実行前に[ツール]-[参照設定]メニューで「Microsoft Active X Data Object 6.0 Library」などの
'   ライブラリを参照できるようにチェックすること。
'
'   Hive側のテーブル数が1802以上の場合、1802回目のCurrentDb.TableDefs.Appendの
'   処理で「実行エラー '3146': ODBC--呼び出しが失敗しました。」が発生
'   する。(Office 2013で確認)
'
' ========================================================================
Sub ConnectHiveTables()

Dim hiveCs As String

Dim adoCon As ADODB.Connection
Dim adoRs As ADODB.Recordset

Dim accessTableName As String
Dim daoTableDef As DAO.TableDef
Dim sourceTableName As String

    ' ODBC経由でHiveに接続するための接続文字列を設定
    hiveCs = "DSN=ODBC_HIVE;Driver=Microsoft Hive ODBC Driver;UID=;PWD=;"
    
    ' Hiveに接続
    Set adoCon = New ADODB.Connection
    adoCon.Open (hiveCs)

    ' Hive上のテーブル情報を取得
    Set adoRs = adoCon.OpenSchema(adSchemaTables)
    
    Do While Not adoRs.EOF
    
        ' Access上のテーブル名を決定
        accessTableName = adoRs.Fields("TABLE_SCHEMA") & "_" & adoRs.Fields("TABLE_NAME")
        
        ' Access上にテーブルが存在するかチェックし、存在する場合は処理を飛ばす
        If DCount("[Name]", "MSysObjects", "[Name] = '" & accessTableName & "'") = 1 Then
            Debug.Print "Skip" & vbTab & accessTableName
            GoTo NextTable
        End If
        
        ' リンクテーブルの接続先となるHive上のテーブル名を決定
        sourceTableName = adoRs.Fields("TABLE_SCHEMA") & "." & adoRs.Fields("TABLE_NAME")
        
        ' リンクテーブルを作成
        Set daoTableDef = CurrentDb.CreateTableDef(accessTableName)
        With daoTableDef
            .Connect = "ODBC;" & hiveCs
            .sourceTableName = sourceTableName
        End With
        
        CurrentDb.TableDefs.Append daoTableDef
        
        Debug.Print "Append" & vbTab & accessTableName & vbTab & "(source='" & sourceTableName & "')"
        
NextTable:
        adoRs.MoveNext
        
        DoEvents
    Loop
    
    adoRs.Close
    adoCon.Close
    

End Sub


Please give us your valuable comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください