다음을 통해 공유


Go용 Databricks SQL 드라이버

Go용 Databricks SQL 드라이버는 Go 코드를 사용하여 Azure Databricks 컴퓨팅 리소스에서 SQL 명령을 실행할 수 있는 Go 라이브러리입니다. 이 문서에서는 Databricks SQL Driver for Go 추가 정보, API 참조예제를 보완합니다.

요구 사항

Databricks SQL Driver for Go 시작

  1. Go 1.20 이상이 이미 설치되어 있고 기존 Go 코드 프로젝트가 이미 만들어진 개발 머신에서 다음 명령을 실행 go mod init 하여 Go 코드의 종속성을 추적하는 파일을 만듭니 go.mod 다.

    go mod init sample
    
  2. 릴리스에 나열된 대로 최신 버전의 Databricks SQL Driver for Go 패키지로 대체 v1.5.2 하여 명령을 실행 go mod edit -require 하여 Databricks SQL Driver for Go 패키지에 종속됩니다.

    go mod edit -require github.com/databricks/databricks-sql-go@v1.5.2
    

    이제 go.mod 파일이 다음과 비슷할 것입니다.

    module sample
    
    go 1.20
    
    require github.com/databricks/databricks-sql-go v1.5.2
    
  3. 프로젝트에서 Databricks SQL Driver for Go를 가져오는 Go 코드 파일을 만듭니다. 다음 예제에서는 다음 내용이 포함된 파일 main.go 에서 Azure Databricks 작업 영역의 모든 클러스터를 나열합니다.

    package main
    
    import (
      "database/sql"
      "os"
      _ "github.com/databricks/databricks-sql-go"
    )
    
    func main() {
      dsn := os.Getenv("DATABRICKS_DSN")
    
      if dsn == "" {
        panic("No connection string found. " +
         "Set the DATABRICKS_DSN environment variable, and try again.")
      }
    
      db, err := sql.Open("databricks", dsn)
      if err != nil {
        panic(err)
      }
      defer db.Close()
    
      if err := db.Ping(); err != nil {
        panic(err)
      }
    }
    
  4. go mod tidy 명령을 실행하여 누락된 모듈 종속성을 추가합니다.

    go mod tidy
    

    참고 항목

    오류가 go: warning: "all" matched no packages발생하면 Databricks SQL Driver for Go를 가져오는 Go 코드 파일을 추가하는 것을 잊어버렸습니다.

  5. 명령을 실행하여 모듈에서 패키지의 빌드 및 테스트를 지원하는 데 필요한 모든 패키지 main 의 복사본을 go mod vendor 만듭니다.

    go mod vendor
    
  6. 필요에 따라 코드를 수정하여 Azure Databricks 인증DATABRICKS_DSN 대한 환경 변수를 설정합니다. DSN 연결 문자열 연결도 참조하세요.

  7. go run 명령을 실행하여 main.go라는 파일을 가정한 Go 코드 파일을 실행합니다.

    go run main.go
    
  8. 오류가 반환되지 않으면 Azure Databricks 작업 영역에서 Databricks SQL Driver for Go를 성공적으로 인증하고 해당 작업 영역에서 실행 중인 Azure Databricks 클러스터 또는 SQL 웨어하우스에 연결했습니다.

DSN 연결 문자열 연결

클러스터 및 SQL 웨어하우스에 액세스하려면 sql.Open()를 사용하여 DSN(데이터 원본 이름) 연결 문자열을 통해 데이터베이스 핸들을 만듭니다. 이 코드 예제는 DATABRICKS_DSN이라는 환경 변수에서 DSN 연결 문자열을 검색합니다.

package main

import (
  "database/sql"
  "os"
  _ "github.com/databricks/databricks-sql-go"
)

func main() {
  dsn := os.Getenv("DATABRICKS_DSN")

  if dsn == "" {
    panic("No connection string found. " +
          "Set the DATABRICKS_DSN environment variable, and try again.")
  }

  db, err := sql.Open("databricks", dsn)
  if err != nil {
    panic(err)
  }
  defer db.Close()

  if err := db.Ping(); err != nil {
    panic(err)
  }
}

DSN 연결 문자열 올바른 형식으로 지정하려면 인증의 DSN 연결 문자열 예제를 참조하세요. 예를 들어 Azure Databricks 개인용 액세스 토큰 인증의 경우 다음 구문을 사용합니다. 여기서는 다음 구문을 사용합니다.

  • <personal-access-token>은 요구 사항의 Azure Databricks 개인용 액세스 토큰입니다.
  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 일반적으로 443요구 사항의 포트 값입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.
  • <paramX=valueX>는 이 문서의 뒷부분에 나열된 하나 이상의 선택적 매개 변수입니다.
token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>?<param1=value1>&<param2=value2>

예를 들어, 클러스터의 경우:

token:dapi12345678901234567890123456789012@adb-1234567890123456.7.azuredatabricks.net:443/sql/protocolv1/o/1234567890123456/1234-567890-abcdefgh

예를 들어, SQL 웨어하우스의 경우:

token:dapi12345678901234567890123456789012@adb-1234567890123456.7.azuredatabricks.net:443/sql/1.0/endpoints/a1b234c5678901d2

참고 항목

보안 모범 사례로 Go 코드에 이 DSN 연결 문자열을 하드 코딩하면 안 됩니다. 대신 보안 위치에서 이 DSN 연결 문자열을 검색해야 합니다. 예를 들어, 이 문서의 앞부분에 있는 코드 예제에서는 환경 변수를 사용했습니다.

선택적 매개 변수

  • 지원되는 선택적 연결 매개 변수는 .에서 <param=value>지정할 수 있습니다. 더 자주 사용되는 것 중 일부는 다음과 같습니다.
    • catalog: 세션의 초기 카탈로그 이름을 설정합니다.
    • schema: 세션의 초기 스키마 이름을 설정합니다.
    • maxRows: 요청당 가져온 최대 행 수를 설정합니다. 기본값은 10000입니다.
    • timeout: 서버 쿼리 실행에 대한 시간 제한(초)을 추가합니다. 기본값은 제한 시간 없음입니다.
    • userAgentEntry: 파트너를 식별하는 데 사용됩니다. 자세한 내용은 파트너 설명서를 참조하세요.
  • 지원되는 선택적 세션 매개 변수는 .에서 param=value지정할 수 있습니다. 더 자주 사용되는 것 중 일부는 다음과 같습니다.
    • ansi_mode: 부울 문자열. true 세션 문이 ANSI SQL 사양에 지정된 규칙을 준수하도록 합니다. 시스템 기본값은 false입니다.
    • timezone: 문자열(예: America/Los_Angeles). 세션의 표준 시간대를 설정합니다. 시스템 기본값은 UTC입니다.

예를 들어, SQL 웨어하우스의 경우:

token:dapi12345678901234567890123456789012@adb-1234567890123456.7.azuredatabricks.net:443/sql/1.0/endpoints/a1b234c5678901d2?catalog=hive_metastore&schema=example&maxRows=100&timeout=60&timezone=America/Sao_Paulo&ansi_mode=true

함수와 NewConnector 연결

또는 sql.OpenDB()를 사용하여 dbsql.NewConnector()로 만든 새 커넥터 개체를 통해 데이터베이스 핸들을 만듭니다(새 커넥터 개체를 사용하여 Azure Databricks 클러스터 및 SQL 웨어하우스에 연결하려면 Go용 Databricks SQL Driver의 v1.0.0 이상이 필요합니다). 예시:

package main

import (
  "database/sql"
  "os"
  dbsql "github.com/databricks/databricks-sql-go"
)

func main() {
  connector, err := dbsql.NewConnector(
    dbsql.WithAccessToken(os.Getenv("DATABRICKS_ACCESS_TOKEN")),
    dbsql.WithServerHostname(os.Getenv("DATABRICKS_HOST")),
    dbsql.WithPort(443),
    dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  )
  if err != nil {
    panic(err)
  }

  db := sql.OpenDB(connector)
  defer db.Close()

  if err := db.Ping(); err != nil {
    panic(err)
  }
}

올바른 설정 집합 NewConnector 을 지정하려면 인증의 예제를 참조하세요.

참고 항목

보안 모범 사례로 Go 코드에 설정을 하드 코딩 NewConnector 해서는 안 됩니다. 대신 보안 위치에서 이러한 값을 검색해야 합니다. 예를 들어, 앞의 코드는 환경 변수를 사용합니다.

자주 사용되는 기능 옵션 중 일부는 다음과 같습니다.

  • WithAccessToken(<access-token>): 요구 사항의 Azure Databricks 개인용 액세스 토큰입니다. 필수 요소입니다 string.
  • WithServerHostname(<server-hostname>): 요구 사항의 서버 호스트 이름 값입니다. 필수 요소입니다 string.
  • WithPort(<port>): 서버의 포트 번호(일반적으로 443)입니다. 필수 요소입니다 int.
  • WithHTTPPath(<http-path>): 요구 사항의 HTTP 경로 값입니다. 필수 요소입니다 string.
  • WithInitialNamespace(<catalog>, <schema>):세션의 카탈로그 및 스키마 이름입니다. 선택적 string, string입니다.
  • WithMaxRows(<max-rows>): 요청당 가져온 최대 행 수입니다. 기본값은 선택 사항int입니다10000..
  • WithSessionParams(<params-map>): "표준 시간대" 및 "ansi_mode"를 포함한 세션 매개 변수입니다. 선택적 map[string]string입니다.
  • WithTimeout(<timeout>). 서버 쿼리 실행에 대한 시간 제한(time.Duration의)입니다. 기본값은 제한 시간 없음입니다. 선택 사항.
  • WithUserAgentEntry(<isv-name-plus-product-name>). 파트너를 식별하는 데 사용됩니다. 자세한 내용은 파트너 설명서를 참조하세요. 선택적 string입니다.

예시:

connector, err := dbsql.NewConnector(
  dbsql.WithAccessToken(os.Getenv("DATABRICKS_ACCESS_TOKEN")),
  dbsql.WithServerHostname(os.Getenv("DATABRICKS_HOST")),
  dbsql.WithPort(443),
  dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  dbsql.WithInitialNamespace("samples", "nyctaxi"),
  dbsql.WithMaxRows(100),
  dbsql.SessionParams(map[string]string{"timezone": "America/Sao_Paulo", "ansi_mode": "true"}),
  dbsql.WithTimeout(time.Minute),
  dbsql.WithUserAgentEntry("example-user"),
)

인증

Databricks SQL Driver for Go는 다음 Azure Databricks 인증 유형을 지원합니다.

Databricks SQL Driver for Go는 아직 다음 Azure Databricks 인증 유형을 지원하지 않습니다.

Databricks 개인용 액세스 토큰 인증

Azure Databricks 개인용 액세스 토큰 인증과 함께 Databricks SQL Driver for Go를 사용하려면 먼저 다음과 같이 Azure Databricks 개인용 액세스 토큰을 만들어야 합니다.

  1. Azure Databricks 작업 영역의 위쪽 표시줄에서 Azure Databricks 사용자 이름을 클릭한 다음 드롭다운에서 설정을 선택합니다.
  2. 개발자를 클릭합니다.
  3. 액세스 토큰 옆에 있는 관리를 클릭합니다.
  4. 새 토큰 생성을 클릭합니다.
  5. (선택 사항) 나중에 이 토큰을 식별할 수 있도록 하는 설명을 입력하고 토큰의 기본 수명을 90일로 변경합니다. 수명이 없는 토큰을 만들려면(권장하지 않음) 수명(일) 상자를 비워 둡니다(공백).
  6. 생성을 클릭합니다.
  7. 표시된 토큰을 안전한 위치에 복사한 다음 완료를 클릭합니다.

참고 항목

복사한 토큰을 안전한 위치에 저장합니다. 복사한 토큰을 다른 사용자와 공유하지 마세요. 복사한 토큰을 분실하면 정확히 동일한 토큰을 다시 생성할 수 없습니다. 대신 이 프로시저를 반복하여 새 토큰을 만들어야 합니다. 복사한 토큰이 손실되었거나 토큰이 손상되었다고 생각되는 경우 Databricks는 액세스 토큰 페이지의 토큰 옆에 있는 휴지통(해지) 아이콘을 클릭하여 작업 영역에서 해당 토큰 을 즉시 삭제하는 것이 좋습니다.

작업 영역에서 토큰을 만들거나 사용할 수 없는 경우 작업 영역 관리자가 토큰을 사용하지 않도록 설정했거나 토큰을 만들거나 사용할 수 있는 권한을 부여하지 않았기 때문일 수 있습니다. 작업 영역 관리자 또는 다음을 참조하세요.

DSN 연결 문자열 사용하여 Databricks SQL Driver for Go를 인증하고 DSN 연결 문자열 연결의 코드 예제를 인증하려면 다음 DSN 연결 문자열 구문을 사용합니다.

  • <personal-access-token>은 요구 사항의 Azure Databricks 개인용 액세스 토큰입니다.
  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 일반적으로 443요구 사항의 포트 값입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.

이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>

함수를 사용하여 Databricks SQL Driver for Go NewConnector 를 인증하려면 다음 코드 조각과 다음 환경 변수를 설정한 것으로 가정하는 NewConnector 함수를 사용하여 Connect의 코드 예제를 사용합니다.

  • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
  • DATABRICKS_HTTP_PATH클러스터 또는 SQL 웨어하우스에 대한 HTTP 경로 값으로 설정합니다.
  • DATABRICKS_TOKEN- Azure Databricks 개인용 액세스 토큰으로 설정합니다.

환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

connector, err := dbsql.NewConnector(
  dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
  dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  dbsql.WithPort(443),
  dbsql.WithAccessToken(os.Getenv("DATABRICKS_TOKEN")),
)

Microsoft Entra ID(이전의 Azure Active Directory) 토큰 인증

Databricks SQL Driver for Go는 Azure Databricks 사용자 또는 Microsoft Entra ID 서비스 주체에 대한 Microsoft Entra ID(이전의 Azure Active Directory) 토큰을 지원합니다.

Microsoft Entra ID 액세스 토큰을 만들려면 다음을 수행합니다.

  • Azure Databricks 사용자의 경우 Azure CLI사용할 수 있습니다. Azure CLI를 사용하여 사용자에 대한 Microsoft Entra ID(이전의 Azure Active Directory) 토큰 가져오기를 참조하세요.

    Microsoft Entra ID 토큰의 기본 수명은 약 1시간입니다. 새 Microsoft Entra ID 토큰을 만들려면 이 프로세스를 반복합니다.

    DSN 연결 문자열 사용하여 Databricks SQL Driver for Go를 인증하고 DSN 연결 문자열 연결의 코드 예제를 인증하려면 다음 DSN 연결 문자열 구문을 사용합니다.

    • <microsoft-entra-id-token> 은 Microsoft Entra ID 토큰입니다.
    • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
    • <port-number>는 일반적으로 443요구 사항의 포트 값입니다.
    • <http-path>는 요구 사항의 HTTP 경로 값입니다.

    이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

    token:<microsoft-entra-id-token>@<server-hostname>:<port-number>/<http-path>
    

    함수를 사용하여 Databricks SQL Driver for Go NewConnector 를 인증하려면 다음 코드 조각과 다음 환경 변수를 설정한 것으로 가정하는 NewConnector 함수를 사용하여 Connect의 코드 예제를 사용합니다.

    • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
    • DATABRICKS_HTTP_PATH클러스터 또는 SQL 웨어하우스에 대한 HTTP 경로 값으로 설정합니다.
    • DATABRICKS_TOKEN을 Microsoft Entra ID 토큰으로 설정합니다.

    환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

    connector, err := dbsql.NewConnector(
      dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
      dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
      dbsql.WithPort(443),
      dbsql.WithAccessToken(os.Getenv("DATABRICKS_TOKEN")),
    )
    

OAuth U2M(사용자-컴퓨터) 인증

Databricks SQL Driver for Go 버전 1.5.0 이상은 OAuth U2M(사용자-컴퓨터) 인증을 지원합니다.

DSN 연결 문자열 Databricks SQL Driver for Go를 사용하고 DSN 연결 문자열 연결의 코드 예제를 사용하려면 다음 DSN 연결 문자열 구문을 사용합니다.

  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 일반적으로 443요구 사항의 포트 값입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.

이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

<server-hostname>:<port-number>/<http-path>?authType=OauthU2M

함수를 사용하여 Databricks SQL Driver for Go를 NewConnector 인증하려면 먼저 선언에 다음을 import 추가해야 합니다.

"github.com/databricks/databricks-sql-go/auth/oauth/u2m"

그런 다음, 다음 코드 조각과 다음 환경 변수를 설정한 것으로 가정하는 NewConnector 함수를 사용하여 Connect의 코드 예제를 사용합니다.

  • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
  • DATABRICKS_HTTP_PATH클러스터 또는 SQL 웨어하우스에 대한 HTTP 경로 값으로 설정합니다.

환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

authenticator, err := u2m.NewAuthenticator(os.Getenv("DATABRICKS_SERVER_HOSTNAME"), 1*time.Minute)
if err != nil {
  panic(err)
}

connector, err := dbsql.NewConnector(
  dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
  dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  dbsql.WithPort(443),
  dbsql.WithAuthenticator(authenticator),
)

OAuth M2M(컴퓨터 대 컴퓨터) 인증

Databricks SQL Driver for Go 버전 1.5.2 이상은 OAuth M2M(컴퓨터 대 컴퓨터) 인증을 지원합니다.

OAuth M2M 인증과 함께 Databricks SQL Driver for Go를 사용하려면 다음을 수행해야 합니다.

  1. Azure Databricks 작업 영역에서 Azure Databricks 서비스 주체를 만들고 해당 서비스 주체에 대한 OAuth 비밀을 만듭니다.

    서비스 주체 및 해당 OAuth 비밀을 만들려면 서비스 주체를 사용하여 Azure Databricks로 인증을 참조하세요. 서비스 주체의 UUID 또는 애플리케이션 ID 값과 서비스 주체의 OAuth 비밀에 대한 비밀 값을 기록해 둡니다.

  2. 해당 서비스 주체에게 클러스터 또는 웨어하우스에 대한 액세스 권한을 부여합니다.

    서비스 주체에게 클러스터 또는 웨어하우스에 대한 액세스 권한을 부여하려면 컴퓨팅 사용 권한 또는 SQL 웨어하우스 관리를 참조하세요.

DSN 연결 문자열 사용하여 Databricks SQL Driver for Go를 인증하고 DSN 연결 문자열 연결의 코드 예제를 인증하려면 다음 DSN 연결 문자열 구문을 사용합니다.

  • <server-hostname>은 요구 사항의 서버 호스트 이름 값입니다.
  • <port-number>는 일반적으로 443요구 사항의 포트 값입니다.
  • <http-path>는 요구 사항의 HTTP 경로 값입니다.
  • <client-id> 는 서비스 주체의 UUID 또는 애플리케이션 ID 값입니다.
  • <client-secret> 서비스 주체의 OAuth 비밀에 대한 비밀 값입니다.

이 문서의 앞에 나열된 하나 이상의 선택적 매개 변수 를 추가할 수도 있습니다.

<server-hostname>:<port-number>/<http-path>?authType=OAuthM2M&clientID=<client-id>&clientSecret=<client-secret>

함수를 사용하여 Databricks SQL Driver for Go를 NewConnector 인증하려면 먼저 선언에 다음을 import 추가해야 합니다.

"github.com/databricks/databricks-sql-go/auth/oauth/m2m"

그런 다음, 다음 코드 조각과 다음 환경 변수를 설정한 것으로 가정하는 NewConnector 함수를 사용하여 Connect의 코드 예제를 사용합니다.

  • DATABRICKS_SERVER_HOSTNAME클러스터 또는 SQL 웨어하우스의 서버 호스트 이름 값으로 설정합니다.
  • DATABRICKS_HTTP_PATH클러스터 또는 SQL 웨어하우스에 대한 HTTP 경로 값으로 설정합니다.
  • DATABRICKS_CLIENT_ID- 서비스 주체의 UUID 또는 애플리케이션 ID 값으로 설정합니다.
  • DATABRICKS_CLIENT_SECRET- 서비스 주체의 OAuth 비밀에 대한 비밀 값으로 설정합니다.

환경 변수를 설정하려면 운영 체제 설명서를 참조하세요.

authenticator := m2m.NewAuthenticator(
  os.Getenv("DATABRICKS_CLIENT_ID"),
  os.Getenv("DATABRICKS_CLIENT_SECRET"),
  os.Getenv("DATABRICKS_SERVER_HOSTNAME"),
)

connector, err := dbsql.NewConnector(
  dbsql.WithServerHostname(os.Getenv("DATABRICKS_SERVER_HOSTNAME")),
  dbsql.WithHTTPPath(os.Getenv("DATABRICKS_HTTP_PATH")),
  dbsql.WithPort(443),
  dbsql.WithAuthenticator(authenticator),
)

쿼리 데이터

다음 코드 예제에서는 Go용 Databricks SQL 드라이버를 호출하여 Azure Databricks 컴퓨팅 리소스에서 기본 SQL 쿼리를 실행하는 방법을 보여 줍니다. 이 명령은 카탈로그 nyctaxi 스키마의 trips 테이블에서 처음 두 행을 samples 반환합니다.

이 코드 예제는 DATABRICKS_DSN이라는 환경 변수에서 DSN 연결 문자열을 검색합니다.

package main

import (
  "database/sql"
  "fmt"
  "os"
  "time"

  _ "github.com/databricks/databricks-sql-go"
)

func main() {
  dsn := os.Getenv("DATABRICKS_DSN")

  if dsn == "" {
    panic("No connection string found." +
          "Set the DATABRICKS_DSN environment variable, and try again.")
  }

  db, err := sql.Open("databricks", dsn)
  if err != nil {
    panic(err)
  }

  defer db.Close()

  var (
    tpep_pickup_datetime  time.Time
    tpep_dropoff_datetime time.Time
    trip_distance         float64
    fare_amount           float64
    pickup_zip            int
    dropoff_zip           int
  )

  rows, err := db.Query("SELECT * FROM samples.nyctaxi.trips LIMIT 2")
  if err != nil {
    panic(err)
  }

  defer rows.Close()

  fmt.Print("tpep_pickup_datetime,",
    "tpep_dropoff_datetime,",
    "trip_distance,",
    "fare_amount,",
    "pickup_zip,",
    "dropoff_zip\n")

  for rows.Next() {
    err := rows.Scan(&tpep_pickup_datetime,
      &tpep_dropoff_datetime,
      &trip_distance,
      &fare_amount,
      &pickup_zip,
      &dropoff_zip)
    if err != nil {
      panic(err)
    }

    fmt.Print(tpep_pickup_datetime, ",",
      tpep_dropoff_datetime, ",",
      trip_distance, ",",
      fare_amount, ",",
      pickup_zip, ",",
      dropoff_zip, "\n")
  }

  err = rows.Err()
  if err != nil {
    panic(err)
  }
}

Unity 카탈로그 볼륨에서 파일 관리

Databricks SQL Driver를 사용하면 다음 예제와 같이 Unity 카탈로그 볼륨에 로컬 파일을 작성하고, 볼륨에서 파일을 다운로드하고, 볼륨에서 파일을 삭제할 수 있습니다.

package main

import (
  "context"
  "database/sql"
  "os"

  _ "github.com/databricks/databricks-sql-go"
  "github.com/databricks/databricks-sql-go/driverctx"
)

func main() {
  dsn := os.Getenv("DATABRICKS_DSN")

  if dsn == "" {
    panic("No connection string found." +
      "Set the DATABRICKS_DSN environment variable, and try again.")
  }

  db, err := sql.Open("databricks", dsn)
  if err != nil {
    panic(err)
  }
  defer db.Close()

  // For writing local files to volumes and downloading files from volumes,
  // you must first specify the path to the local folder that contains the
  // files to be written or downloaded.
  // For multiple folders, add their paths to the following string array.
  // For deleting files in volumes, this string array is ignored but must
  // still be provided, so in that case its value can be set for example
  // to an empty string.
  ctx := driverctx.NewContextWithStagingInfo(
    context.Background(),
    []string{"/tmp/"},
  )

  // Write a local file to the path in the specified volume.
  // Specify OVERWRITE to overwrite any existing file in that path.
  db.ExecContext(ctx, "PUT '/tmp/my-data.csv' INTO '/Volumes/main/default/my-volume/my-data.csv' OVERWRITE")

  // Download a file from the path in the specified volume.
  db.ExecContext(ctx, "GET '/Volumes/main/default/my-volume/my-data.csv' TO '/tmp/my-downloaded-data.csv'")

  // Delete a file from the path in the specified volume.
  db.ExecContext(ctx, "REMOVE '/Volumes/main/default/my-volume/my-data.csv'")

  db.Close()
}

로깅

Databricks SQL Driver for Go에서 내보내는 메시지를 기록하는 데 사용합니다 github.com/databricks/databricks-sql-go/logger . 다음 코드 예제에서는 DSN 연결 문자열 통해 데이터베이스 핸들을 만드는 데 사용합니다sql.Open(). 이 코드 예제에서는 이름이 지정된 DATABRICKS_DSN환경 변수에서 DSN 연결 문자열 검색합니다. 수준 및 아래에서 내보내 debug 는 모든 로그 메시지는 파일에 기록 results.log 됩니다.

package main

import (
  "database/sql"
  "io"
  "log"
  "os"

  _ "github.com/databricks/databricks-sql-go"
  dbsqllog "github.com/databricks/databricks-sql-go/logger"
)

func main() {
  dsn := os.Getenv("DATABRICKS_DSN")

  // Use the specified file for logging messages to.
  file, err := os.Create("results.log")
  if err != nil {
    log.Fatal(err)
  }
  defer file.Close()

  writer := io.Writer(file)

  // Log messages at the debug level and below.
  if err := dbsqllog.SetLogLevel("debug"); err != nil {
    log.Fatal(err)
  }

  // Log messages to the file.
  dbsqllog.SetLogOutput(writer)

  if dsn == "" {
    panic("Error: Cannot connect. No connection string found. " +
      "Set the DATABRICKS_DSN environment variable, and try again.")
  }

  db, err := sql.Open("databricks", dsn)
  if err != nil {
    panic(err)
  }
  defer db.Close()

  if err := db.Ping(); err != nil {
    panic(err)
  }
}

테스팅

코드를 테스트하려면 테스트 표준 라이브러리와 같은 Go 테스트 프레임워크를 사용합니다. Azure Databricks REST API 엔드포인트를 호출하거나 Azure Databricks 계정 또는 작업 영역의 상태를 변경하지 않고 시뮬레이션된 조건에서 코드를 테스트하려면 testfify와 같은 Go 모의 라이브러리를 사용합니다.

예를 들어 Azure Databricks 작업 영역 연결을 반환하는 GetDBWithDSNPAT 함수, GetNYCTaxiTrips 카탈로그 스키마의 nyctaxi 테이블에서 samples 데이터를 반환하는 함수 및 PrintNYCTaxiTrips 반환된 데이터를 trips 출력하는 함수를 포함하는 다음 파일을 지정 helpers.go 합니다.

package main

import (
  "database/sql"
  "fmt"
  "strconv"
  "time"
)

func GetDBWithDSNPAT(dsn string) (*sql.DB, error) {
  db, err := sql.Open("databricks", dsn)
  if err != nil {
    return nil, err
  }
  return db, nil
}

func GetNYCTaxiTrips(db *sql.DB, numRows int) (*sql.Rows, error) {
  rows, err := db.Query("SELECT * FROM samples.nyctaxi.trips LIMIT " + strconv.Itoa(numRows))
  if err != nil {
    return nil, err
  }
  return rows, nil
}

func PrintNYCTaxiTrips(rows *sql.Rows) {
  var (
    tpep_pickup_datetime  time.Time
    tpep_dropoff_datetime time.Time
    trip_distance         float64
    fare_amount           float64
    pickup_zip            int
    dropoff_zip           int
  )

  fmt.Print(
    "tpep_pickup_datetime,",
    "tpep_dropoff_datetime,",
    "trip_distance,",
    "fare_amount,",
    "pickup_zip,",
    "dropoff_zip\n",
  )

  for rows.Next() {
    err := rows.Scan(
      &tpep_pickup_datetime,
      &tpep_dropoff_datetime,
      &trip_distance,
      &fare_amount,
      &pickup_zip,
      &dropoff_zip,
    )
    if err != nil {
      panic(err)
    }

    fmt.Print(
      tpep_pickup_datetime, ",",
      tpep_dropoff_datetime, ",",
      trip_distance, ",",
      fare_amount, ",",
      pickup_zip, ",",
      dropoff_zip, "\n",
    )
  }

  err := rows.Err()
  if err != nil {
    panic(err)
  }
}

그리고 이러한 함수를 호출하는 다음 파일을 지정 main.go 합니다.

package main

import (
  "os"
)

func main() {
  db, err := GetDBWithDSNPAT(os.Getenv("DATABRICKS_DSN"))
  if err != nil {
    panic(err)
  }

  rows, err := GetNYCTaxiTrips(db, 2)
  if err != nil {
    panic(err)
  }

  PrintNYCTaxiTrips(rows)
}

명명된 helpers_test.go 다음 파일은 함수가 GetNYCTaxiTrips 예상 응답을 반환하는지 여부를 테스트합니다. 이 테스트는 대상 작업 영역에 대한 실제 연결을 만드는 대신 개체를 sql.DB 모의합니다. 또한 이 테스트는 실제 데이터에 있는 스키마 및 값을 준수하는 일부 데이터를 모의합니다. 이 테스트는 모의 연결을 통해 모의 데이터를 반환한 다음 모의 데이터 행 값 중 하나가 예상 값과 일치하는지 확인합니다.

package main

import (
  "database/sql"
  "testing"

  "github.com/stretchr/testify/assert"
  "github.com/stretchr/testify/mock"
)

// Define an interface that contains a method with the same signature
// as the real GetNYCTaxiTrips function that you want to test.
type MockGetNYCTaxiTrips interface {
  GetNYCTaxiTrips(db *sql.DB, numRows int) (*sql.Rows, error)
}

// Define a struct that represents the receiver of the interface's method
// that you want to test.
type MockGetNYCTaxiTripsObj struct {
  mock.Mock
}

// Define the behavior of the interface's method that you want to test.
func (m *MockGetNYCTaxiTripsObj) GetNYCTaxiTrips(db *sql.DB, numRows int) (*sql.Rows, error) {
  args := m.Called(db, numRows)
  return args.Get(0).(*sql.Rows), args.Error(1)
}

func TestGetNYCTaxiTrips(t *testing.T) {
  // Instantiate the receiver.
  mockGetNYCTaxiTripsObj := new(MockGetNYCTaxiTripsObj)

  // Define how the mock function should be called and what it should return.
  // We're not concerned with whether the actual database is connected to--just
  // what is returned.
  mockGetNYCTaxiTripsObj.On("GetNYCTaxiTrips", mock.Anything, mock.AnythingOfType("int")).Return(&sql.Rows{}, nil)

  // Call the mock function that you want to test.
  rows, err := mockGetNYCTaxiTripsObj.GetNYCTaxiTrips(nil, 2)

  // Assert that the mock function was called as expected.
  mockGetNYCTaxiTripsObj.AssertExpectations(t)

  // Assert that the mock function returned what you expected.
  assert.NotNil(t, rows)
  assert.Nil(t, err)
}

함수는 GetNYCTaxiTrips 문을 포함 SELECT 하므로 테이블의 상태를 변경하지 않으므로 이 예제에서는 모의 trips 작업이 반드시 필요하지 않습니다. 그러나 모의 작업을 사용하면 작업 영역과의 실제 연결을 기다리지 않고 테스트를 신속하게 실행할 수 있습니다. 또한 모의 작업을 사용하면 다음과 같이 INSERT INTOUPDATEDELETE FROM테이블의 상태를 변경할 수 있는 함수에 대해 시뮬레이션된 테스트를 여러 번 실행할 수 있습니다.

추가 리소스