Megosztás a következőn keresztül:


Databricks SQL Driver for Go

A Databricks SQL Driver for Go egy Go-kódtár , amely lehetővé teszi, hogy Go-kód használatával SQL-parancsokat futtasson az Azure Databricks számítási erőforrásain. Ez a cikk kiegészíti a Databricks SQL-illesztőprogramot a Go README-hez, az API-referenciákat és példákat.

Követelmények

A Databricks SQL Driver for Go használatának első lépései

  1. A Go 1.20 vagy újabb verziójú fejlesztői gépen, és már létrehozott egy meglévő Go-kódprojektet, hozzon létre egy go.mod fájlt a Go-kód függőségeinek nyomon követéséhez a go mod init parancs futtatásával, például:

    go mod init sample
    
  2. A Databricks SQL Driver for Go csomagtól való függőséget a parancs futtatásával go mod edit -require , a Databricks SQL Driver for Go csomag legújabb verziójára cserélve v1.5.2 , a kiadásokban felsorolt módon:

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

    A go.mod fájlnak így kell kinéznie:

    module sample
    
    go 1.20
    
    require github.com/databricks/databricks-sql-go v1.5.2
    
  3. A projektben hozzon létre egy Go-kódfájlt, amely importálja a Databricks SQL Driver for Go-t. Az alábbi példa egy, a következő tartalommal elnevezett main.go fájlban felsorolja az Azure Databricks-munkaterület összes fürtjének listáját:

    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. Adja hozzá a hiányzó modulfüggőségeket a go mod tidy parancs futtatásával:

    go mod tidy
    

    Feljegyzés

    Ha megjelenik a hiba go: warning: "all" matched no packages, elfelejtette hozzáadni a Databricks SQL Driver for Go-t importáló Go-kódfájlt.

  5. Készítsen másolatot a modulban lévő main csomagok buildjeinek és tesztjeinek támogatásához szükséges összes csomagról a go mod vendor parancs futtatásával:

    go mod vendor
    
  6. Szükség szerint módosítsa a kódot az DATABRICKS_DSN Azure Databricks-hitelesítés környezeti változójának beállításához. Lásd még: Csatlakozás DSN-kapcsolati sztring.

  7. Futtassa a Go-kódfájlt, feltéve, hogy a következő nevű fájlt main.gofuttatja:go run

    go run main.go
    
  8. Ha nem ad vissza hibát, sikeresen hitelesítette a Databricks SQL Driver for Go-t az Azure Databricks-munkaterülettel, és csatlakozott a munkaterületen futó Azure Databricks-fürthöz vagy SQL Warehouse-hoz.

Csatlakozás DSN-kapcsolati sztring

Fürtök és SQL-raktárak sql.Open() eléréséhez hozzon létre egy adatbázis-kezelőt egy adatforrásnévvel (DSN) kapcsolati sztring. Ez a példakód lekéri a DSN-kapcsolati sztring a következő nevű DATABRICKS_DSNkörnyezeti változóból:

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)
  }
}

A DSN-kapcsolati sztring helyes formátumban történő megadásához tekintse meg a DSN kapcsolati sztring példákat a hitelesítésben. Az Azure Databricks személyes hozzáférési jogkivonatának hitelesítéséhez például használja a következő szintaxist, ahol:

  • <personal-access-token> Az Azure Databricks személyes hozzáférési jogkivonata a követelményekből.
  • <server-hostname> A kiszolgáló gazdagépnevének értéke a követelményekből.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.
  • <paramX=valueX>A cikk későbbi részében felsorolt egy vagy több választható paraméter.
token:<personal-access-token>@<server-hostname>:<port-number>/<http-path>?<param1=value1>&<param2=value2>

Például egy fürt esetében:

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

Például egy SQL-raktár esetében:

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

Feljegyzés

Ajánlott biztonsági eljárásként ne kódozza be ezt a DSN-t a Go-kódba kapcsolati sztring. Ehelyett le kell kérnie ezt a DSN-kapcsolati sztring egy biztonságos helyről. A cikk korábbi példakódja például egy környezeti változót használt.

Választható paraméterek

  • A támogatott választható kapcsolati paraméterek a következőben <param=value>adhatók meg: . A leggyakrabban használtak közé tartoznak a következők:
    • catalog: Beállítja a kezdeti katalógusnevet a munkamenetben.
    • schema: Beállítja a kezdeti sémanevet a munkamenetben.
    • maxRows: Beállítja a kérésenként lekért sorok maximális számát. Az alapértelmezett érték 10000.
    • timeout: Hozzáadja a kiszolgálói lekérdezés végrehajtásához szükséges időtúllépést (másodpercben). Az alapértelmezett érték nem időtúllépés.
    • userAgentEntry: Partnerek azonosítására szolgál. További információkért tekintse meg a partner dokumentációját.
  • A támogatott opcionális munkamenetparaméterek a következőben param=valueadhatók meg: A leggyakrabban használtak közé tartoznak a következők:
    • ansi_mode: Logikai sztring. true a munkamenet-utasítások az ANSI SQL-specifikációban meghatározott szabályok betartásához. A rendszer alapértelmezése hamis.
    • timezone: Egy sztring, például America/Los_Angeles. Beállítja a munkamenet időzónáját. A rendszer alapértelmezett értéke UTC.

Például egy SQL-raktár esetében:

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

Csatlakozás a NewConnector függvényhez

Azt is megteheti sql.OpenDB() , hogy egy új összekötőobjektumon dbsql.NewConnector() keresztül hoz létre adatbázis-kezelőt (az Új összekötő objektummal rendelkező Azure Databricks-fürtökhöz és SQL-tárolókhoz való csatlakozáshoz a Databricks SQL Driver for Go 1.0.0-s vagy újabb verziója szükséges). Példa:

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)
  }
}

A megfelelő beállításkészlet NewConnector megadásához tekintse meg a hitelesítés példáit.

Feljegyzés

Biztonsági ajánlott eljárásként ne írja be a NewConnector beállításokat a Go-kódba. Ehelyett ezeket az értékeket biztonságos helyről kell lekérnie. Az előző kód például környezeti változókat használ.

A leggyakrabban használt funkcionális lehetőségek közé tartoznak a következők:

  • WithAccessToken(<access-token>): Az Azure Databricks személyes hozzáférési jogkivonata a követelményekből. Kötelező string.
  • WithServerHostname(<server-hostname>): A kiszolgáló gazdagépnév értéke a követelményekből. Kötelező string.
  • WithPort(<port>): A kiszolgáló portszáma általában 443. Kötelező int.
  • WithHTTPPath(<http-path>): A http-elérési út értéke a követelményekből. Kötelező string.
  • WithInitialNamespace(<catalog>, <schema>):A katalógus és a séma neve a munkamenetben. Nem kötelezőstring, string.
  • WithMaxRows(<max-rows>): A lekért sorok maximális száma kérésenként. Az alapértelmezett beállítás nem 10000. kötelező int.
  • WithSessionParams(<params-map>): A munkamenet paraméterei, beleértve az "időzónát" és a "ansi_mode". Nem kötelezőmap[string]string.
  • WithTimeout(<timeout>). A kiszolgálói lekérdezés végrehajtásának időtúllépése (in time.Duration) Az alapértelmezett érték nem időtúllépés. Opcionális.
  • WithUserAgentEntry(<isv-name-plus-product-name>). Partnerek azonosítására szolgál. További információkért tekintse meg a partner dokumentációját. Nem kötelezőstring.

Példa:

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"),
)

Hitelesítés

A Databricks SQL Driver for Go a következő Azure Databricks-hitelesítési típusokat támogatja:

A Databricks SQL Driver for Go még nem támogatja a következő Azure Databricks-hitelesítési típusokat:

Databricks személyes hozzáférési jogkivonat hitelesítése

A Databricks SQL Driver for Go Azure Databricks személyes hozzáférési jogkivonat-hitelesítéssel való használatához először létre kell hoznia egy Azure Databricks személyes hozzáférési jogkivonatot az alábbiak szerint:

  1. Az Azure Databricks-munkaterületen kattintson az Azure Databricks-felhasználónevére a felső sávon, majd válassza a legördülő menü Beállítások elemét .
  2. Kattintson a Fejlesztőeszközök elemre.
  3. Az Access-jogkivonatok mellett kattintson a Kezelés gombra.
  4. Kattintson az Új jogkivonat létrehozása elemre.
  5. (Nem kötelező) Írjon be egy megjegyzést, amely segít azonosítani a jogkivonatot a jövőben, és módosíthatja a jogkivonat alapértelmezett 90 napos élettartamát. Élettartam nélküli (nem ajánlott) jogkivonat létrehozásához hagyja üresen az Élettartam (nap) mezőt (üres).
  6. Kattintson a Létrehozás lehetőségre.
  7. Másolja a megjelenített jogkivonatot egy biztonságos helyre, majd kattintson a Kész gombra.

Feljegyzés

Ügyeljen arra, hogy a másolt jogkivonatot biztonságos helyre mentse. Ne ossza meg másokkal a másolt jogkivonatot. Ha elveszíti a másolt jogkivonatot, nem tudja pontosan ugyanazt a jogkivonatot újragenerálni. Ehelyett meg kell ismételnie ezt az eljárást egy új jogkivonat létrehozásához. Ha elveszíti a másolt jogkivonatot, vagy úgy véli, hogy a jogkivonat sérült, a Databricks határozottan javasolja, hogy azonnal törölje a jogkivonatot a munkaterületről az Access-jogkivonatok lapon a jogkivonat melletti kuka (Visszavonás) ikonra kattintva.

Ha nem tud jogkivonatokat létrehozni vagy használni a munkaterületen, ennek az lehet az oka, hogy a munkaterület rendszergazdája letiltotta a jogkivonatokat, vagy nem adott engedélyt a jogkivonatok létrehozására vagy használatára. Tekintse meg a munkaterület rendszergazdáját vagy a következőket:

A Databricks SQL Driver for Go DSN-kapcsolati sztring és a Connect with a DSN kapcsolati sztring kód példájának hitelesítéséhez használja a következő DSN-kapcsolati sztring szintaxist, ahol:

  • <personal-access-token> Az Azure Databricks személyes hozzáférési jogkivonata a követelményekből.
  • <server-hostname> A kiszolgáló gazdagépnevének értéke a követelményekből.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.

Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez használja a következő kódrészletet és a Connect with the NewConnector függvény kódpéldát, amely feltételezi, hogy a következő környezeti változókat állította be:

  • DATABRICKS_SERVER_HOSTNAMEelemet a fürt vagy az SQL Warehouse kiszolgálói állomásnév értékére állítja.
  • DATABRICKS_HTTP_PATHelemet, állítsa be a HTTP-elérési út értékét a fürthöz vagy az SQL Warehouse-hoz.
  • DATABRICKS_TOKENbeállításnál állítsa be az Azure Databricks személyes hozzáférési jogkivonatát.

A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

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 (korábbi nevén Azure Active Directory) jogkivonat-hitelesítés

A Databricks SQL Driver for Go támogatja a Microsoft Entra ID (korábbi nevén Azure Active Directory) jogkivonatokat egy Azure Databricks-felhasználóhoz vagy egy Microsoft Entra ID szolgáltatásnévhez.

Microsoft Entra ID hozzáférési jogkivonat létrehozásához tegye a következőket:

  • Azure Databricks-felhasználó esetén használhatja az Azure CLI-t. Lásd: Microsoft Entra-azonosítók (korábbi nevén Azure Active Directory-) jogkivonatok lekérése a felhasználók számára az Azure CLI használatával.

    A Microsoft Entra ID-jogkivonatok alapértelmezett élettartama körülbelül 1 óra. Új Microsoft Entra ID-jogkivonat létrehozásához ismételje meg ezt a folyamatot.

    A Databricks SQL Driver for Go DSN-kapcsolati sztring és a Connect with a DSN kapcsolati sztring kód példájának hitelesítéséhez használja a következő DSN-kapcsolati sztring szintaxist, ahol:

    • <microsoft-entra-id-token> A Microsoft Entra ID-jogkivonata.
    • <server-hostname> A kiszolgáló gazdagépnevének értéke a követelményekből.
    • <port-number> a követelmények portértéke , amely általában 443.
    • <http-path> a követelmények http-elérési útvonalának értéke.

    Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

    A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez használja a következő kódrészletet és a Connect with the NewConnector függvény kódpéldát, amely feltételezi, hogy a következő környezeti változókat állította be:

    • DATABRICKS_SERVER_HOSTNAMEelemet a fürt vagy az SQL Warehouse kiszolgálói állomásnév értékére állítja.
    • DATABRICKS_HTTP_PATHelemet, állítsa be a HTTP-elérési út értékét a fürthöz vagy az SQL Warehouse-hoz.
    • DATABRICKS_TOKENelemet, állítsa be a Microsoft Entra ID-jogkivonatot.

    A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

    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 user-to-machine (U2M) hitelesítés

A Databricks SQL Driver for Go 1.5.0-s és újabb verziói támogatják az OAuth felhasználó–gép (U2M) hitelesítést.

A Databricks SQL Driver for Go DSN-kapcsolati sztring és a Connect with a DSN kapcsolati sztring kód példájának használatához használja a következő DSN-kapcsolati sztring szintaxist, ahol:

  • <server-hostname> A kiszolgáló gazdagépnevének értéke a követelményekből.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.

Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez először a következőket kell hozzáadnia a import deklarációhoz:

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

Ezután használja a következő kódrészletet és a Kódpéldát a Connect with the NewConnector függvényben, amely feltételezi, hogy a következő környezeti változókat állította be:

  • DATABRICKS_SERVER_HOSTNAMEelemet a fürt vagy az SQL Warehouse kiszolgálói állomásnév értékére állítja.
  • DATABRICKS_HTTP_PATHelemet, állítsa be a HTTP-elérési út értékét a fürthöz vagy az SQL Warehouse-hoz.

A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

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 machine-to-machine (M2M) hitelesítés

A Databricks SQL Driver for Go 1.5.2-es és újabb verziói támogatják az OAuth machine-to-machine (M2M) hitelesítést.

A Databricks SQL Driver for Go OAuth M2M-hitelesítéssel való használatához a következőket kell tennie:

  1. Hozzon létre egy Azure Databricks-szolgáltatásnevet az Azure Databricks-munkaterületen, és hozzon létre egy OAuth-titkos kulcsot a szolgáltatásnévhez.

    A szolgáltatásnév és az OAuth-titkos kód létrehozásához lásd : Szolgáltatásnév használata az Azure Databricks használatával történő hitelesítéshez. Jegyezze fel a szolgáltatásnév UUID - vagy alkalmazásazonosító-értékét , valamint a szolgáltatásnév OAuth-titkos kódjának titkos értékét.

  2. Adjon hozzáférést a szolgáltatásnévnek a fürthöz vagy a raktárhoz.

    Ha hozzáférést szeretne adni a szolgáltatásnévnek a fürthöz vagy a raktárhoz, olvassa el a számítási engedélyeket vagy az SQL-raktár kezelését.

A Databricks SQL Driver for Go DSN-kapcsolati sztring és a Connect with a DSN kapcsolati sztring kód példájának hitelesítéséhez használja a következő DSN-kapcsolati sztring szintaxist, ahol:

  • <server-hostname> A kiszolgáló gazdagépnevének értéke a követelményekből.
  • <port-number> a követelmények portértéke , amely általában 443.
  • <http-path> a követelmények http-elérési útvonalának értéke.
  • <client-id> A szolgáltatásnév UUID - vagy alkalmazásazonosító-értéke .
  • <client-secret> A szolgáltatásnév OAuth-titkos kódjának titkos értéke.

Hozzáfűzhet egy vagy több választható paramétert is a cikkben korábban felsoroltakhoz.

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

A Databricks SQL Driver for Go függvénysel való NewConnector hitelesítéséhez először a következőket kell hozzáadnia a import deklarációhoz:

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

Ezután használja a következő kódrészletet és a Kódpéldát a Connect with the NewConnector függvényben, amely feltételezi, hogy a következő környezeti változókat állította be:

  • DATABRICKS_SERVER_HOSTNAMEelemet a fürt vagy az SQL Warehouse kiszolgálói állomásnév értékére állítja.
  • DATABRICKS_HTTP_PATHelemet, állítsa be a HTTP-elérési út értékét a fürthöz vagy az SQL Warehouse-hoz.
  • DATABRICKS_CLIENT_ID, állítsa be a szolgáltatásnév UUID - vagy alkalmazásazonosító-értékét .
  • DATABRICKS_CLIENT_SECRET, állítsa be a szolgáltatásnév OAuth-titkos kódjának titkos értékét.

A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

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),
)

Adatok lekérdezése

Az alábbi példakód bemutatja, hogyan hívhatja meg a Databricks SQL Driver for Go-t egy alapszintű SQL-lekérdezés futtatásához egy Azure Databricks számítási erőforráson. Ez a parancs a katalógus sémájában lévő samples táblázat első két sorát trips nyctaxi adja vissza.

Ez a példakód lekéri a DSN-kapcsolati sztring egy nevesített DATABRICKS_DSNkörnyezeti változóból.

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)
  }
}

Fájlok kezelése Unity Catalog-kötetekben

A Databricks SQL-illesztővel helyi fájlokat írhat a Unity Catalog-kötetekbe, fájlokat tölthet le kötetekről, és fájlokat törölhet a kötetekből, ahogyan az alábbi példában látható:

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()
}

Naplózás

A Databricks SQL Driver for Go által kibocsátott üzenetek naplózására használható github.com/databricks/databricks-sql-go/logger . Az alábbi példakód egy adatbázis-kezelő DSN-kapcsolati sztring keresztüli létrehozására szolgálsql.Open(). Ez a példakód lekéri a DSN-kapcsolati sztring egy nevesített DATABRICKS_DSNkörnyezeti változóból. Minden, az debug adott szinten és alatt kibocsátott naplóüzenet a results.log fájlba lesz írva.

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)
  }
}

Tesztelés

A kód teszteléséhez használja a Go tesztelési keretrendszereket, például a tesztelési standard kódtárat. Ha szimulált körülmények között szeretné tesztelni a kódot az Azure Databricks REST API-végpontok meghívása vagy az Azure Databricks-fiókok vagy -munkaterületek állapotának módosítása nélkül, használja a Go-kódtárakat, például a testfify-et.

Ha például a következő fájl neve helpers.go egy GetDBWithDSNPAT Azure Databricks-munkaterületi kapcsolatot visszaadó függvényt tartalmaz, egy GetNYCTaxiTrips függvény, amely adatokat ad vissza a trips samples katalógus sémájában nyctaxi lévő táblából, és a PrintNYCTaxiTrips visszaadott adatokat kinyomtatja:

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)
  }
}

És mivel a következő fájl neve main.go hívja ezeket a függvényeket:

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)
}

A következő elnevezett helpers_test.go fájl ellenőrzi, hogy a GetNYCTaxiTrips függvény a várt választ adja-e vissza. Ahelyett, hogy valódi kapcsolatot hoz létre a cél-munkaterülethez, ez a teszt egy sql.DB objektumot szimulál. A teszt néhány olyan adatot is szimulál, amely megfelel a valós adatok sémájának és értékeinek. A teszt a szimulált kapcsolaton keresztül adja vissza a szimulált adatokat, majd ellenőrzi, hogy a szimulált adatsorok egyik értéke megegyezik-e a várt értékkel.

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)
}

Mivel a GetNYCTaxiTrips függvény utasítást SELECT tartalmaz, ezért nem módosítja a trips tábla állapotát, ebben a példában nem feltétlenül szükséges a modellezés. A gúnyolással azonban gyorsan futtathatja a teszteket anélkül, hogy tényleges kapcsolatra kellene várnia a munkaterülettel. A gúnyolással szimulált teszteket is futtathat többször olyan függvények esetében, amelyek megváltoztathatják egy tábla állapotát, például INSERT INTO: , UPDATEés DELETE FROM.

További erőforrások