Udostępnij za pośrednictwem


Zapytania o dane

Wykonywanie zapytań dotyczących danych jest podstawowym krokiem do wykonywania prawie wszystkich zadań opartych na danych w usłudze Azure Databricks. Niezależnie od używanego języka lub narzędzia obciążenia zaczynają się od zdefiniowania zapytania względem tabeli lub innego źródła danych, a następnie wykonywania akcji w celu uzyskania szczegółowych informacji z danych. W tym artykule opisano podstawowe pojęcia i procedury uruchamiania zapytań w różnych ofertach produktów usługi Azure Databricks oraz przykłady kodu, które można dostosować do danego przypadku użycia.

Dane można wykonywać interaktywnie przy użyciu:

  • Notesy
  • Edytor SQL
  • Edytor plików
  • Pulpity nawigacyjne

Można również uruchamiać zapytania w ramach potoków lub zadań Delta Live Tables.

Aby zapoznać się z omówieniem zapytań przesyłanych strumieniowo w usłudze Azure Databricks, zobacz Query streaming data (Wykonywanie zapytań dotyczących danych przesyłanych strumieniowo).

Jakie dane można wykonywać za pomocą usługi Azure Databricks?

Usługa Azure Databricks obsługuje wykonywanie zapytań dotyczących danych w wielu formatach i systemach przedsiębiorstwa. Dane, które wykonujesz za pomocą usługi Azure Databricks, należą do jednej z dwóch szerokich kategorii: danych w usłudze Databricks lakehouse i danych zewnętrznych.

Jakie dane są w magazynie lakehouse usługi Databricks?

Platforma analizy danych usługi Databricks domyślnie przechowuje wszystkie dane w usłudze Databricks Lakehouse.

Oznacza to, że po uruchomieniu podstawowej instrukcji CREATE TABLE w celu utworzenia nowej tabeli utworzono tabelę lakehouse. Dane usługi Lakehouse mają następujące właściwości:

  • Przechowywane w formacie usługi Delta Lake.
  • Przechowywane w magazynie obiektów w chmurze.
  • Podlega katalogowi Unity Catalog.

Większość danych Lakehouse w Azure Databricks jest rejestrowana w Unity Catalog jako tabele zarządzane. Tabele zarządzane zapewniają najłatwiejszą składnię i zachowują się jak inne tabele w większości systemów zarządzania relacyjnymi bazami danych. Tabele zarządzane są zalecane w większości przypadków użycia i są odpowiednie dla wszystkich użytkowników, którzy nie chcą martwić się o szczegóły implementacji magazynu danych.

Tabela niezarządzana lub tabela zewnętrzna to tabela zarejestrowana w określonym LOCATION. Termin zewnętrzny może być mylący, ponieważ zewnętrzne tabele delty są nadal danymi typu lakehouse. Tabele niezarządzane mogą być preferowane przez użytkowników, którzy uzyskują bezpośredni dostęp do tabel z innych klientów czytnika delty. Aby zapoznać się z omówieniem różnic w semantyce tabel, zobacz Co to są tabele i widoki?.

Niektóre starsze obciążenia mogą korzystać wyłącznie z danych usługi Delta Lake za pośrednictwem ścieżek plików i w ogóle nie rejestrować tabel. Te dane są nadal danymi lakehouse, ale mogą być trudniejsze do odnalezienia, ponieważ nie są zarejestrowane w Unity Catalog.

Uwaga

Administrator obszaru roboczego mógł nie zaktualizować zarządzania danymi, aby korzystać z Unity Catalog. Nadal możesz uzyskać wiele korzyści z usługi Databricks Lakehouse bez Unity Catalog, ale nie wszystkie funkcje wymienione w tym artykule ani w całości dokumentacji usługi Azure Databricks są obsługiwane.

Jakie dane są uznawane za zewnętrzne?

Wszelkie dane, które nie są w usłudze Databricks Lakehouse, można traktować jako dane zewnętrzne. Oto kilka przykładów danych zewnętrznych:

  • Tabele zewnętrzne zarejestrowane w federacji Lakehouse.
  • Tabele w magazynie metadanych Hive wspierane przez Parquet.
  • Tabele zewnętrzne w katalogu Unity oparte na JSON.
  • Dane CSV przechowywane w magazynie obiektów w chmurze.
  • Dane przesyłane strumieniowo z platformy Kafka.

Usługa Azure Databricks obsługuje konfigurowanie połączeń z wieloma źródłami danych. Zobacz Nawiązywanie połączenia ze źródłami danych.

Chociaż można używać Unity Catalog do zarządzania dostępem do tabel i ich definiowania w kontekście danych przechowywanych w wielu formatach i systemach zewnętrznych, konieczne jest użycie Delta Lake, aby dane mogły być brane pod uwagę w lakehouse.

Usługa Delta Lake zapewnia wszystkie gwarancje transakcyjne w usłudze Azure Databricks, które mają kluczowe znaczenie dla utrzymania integralności i spójności danych. Jeśli chcesz dowiedzieć się więcej na temat gwarancji transakcyjnych dotyczących danych usługi Azure Databricks i dlaczego są one ważne, zobacz Co to są gwarancje ACID w usłudze Azure Databricks?.

Większość użytkowników usługi Azure Databricks wykonuje zapytania dotyczące kombinacji danych typu lakehouse i danych zewnętrznych. Nawiązywanie połączenia z danymi zewnętrznymi jest zawsze pierwszym krokiem w przypadku pozyskiwania danych i potoków ETL, które wprowadzają dane do magazynu typu lakehouse. Aby uzyskać informacje na temat pozyskiwania danych, zobacz pozyskiwanie danych do usługi Azure Databricks lakehouse.

Tabele zapytań według nazwy

W przypadku wszystkich danych zarejestrowanych jako tabela usługa Databricks zaleca wykonywanie zapytań przy użyciu nazwy tabeli.

Jeśli używasz Unity Catalog, tabele korzystają z trójwarstwowej przestrzeni nazw w następującym formacie: <catalog-name>.<schema-name>.<table-name>.

Bez katalogu Unity identyfikatory tabel używają formatu <schema-name>.<table-name>.

Uwaga

Usługa Azure Databricks dziedziczy znaczną część składni SQL z platformy Apache Spark, która nie rozróżnia wartości SCHEMA i DATABASE.

Wykonywanie zapytań według nazwy tabeli jest obsługiwane we wszystkich kontekstach wykonywania usługi Azure Databricks i obsługiwanych językach.

SQL

SELECT * FROM catalog_name.schema_name.table_name

Python

spark.read.table("catalog_name.schema_name.table_name")

rozwiązywanie identyfikatora Katalogu Unity

Usługa Databricks zaleca używanie w pełni kwalifikowanych identyfikatorów w przypadku interakcji zapytań lub obciążeń z obiektami bazy danych przechowywanymi w wielu schematach lub katalogach.

W poniższej tabeli przedstawiono zachowania częściowo kwalifikowanych i niekwalifikowanych identyfikatorów:

Wzorzec identyfikatora Zachowanie
catalog_name.schema_name.object_name Odwołuje się do obiektu bazy danych określonego przez identyfikator.
schema_name.object_name Odwołuje się do obiektu bazy danych związanego z określonym schema_name i object_name w bieżącym katalogu.
object_name Odwołuje się do obiektu bazy danych skojarzonego z określonym object_name w bieżącym katalogu i schemacie.

Jaki jest bieżący wykaz i schemat?

W interaktywnych środowiskach obliczeniowych użyj current_catalog() i current_schema(), aby potwierdzić bieżący katalog i schemat.

Wszystkie obszary robocze skonfigurowane za pomocą Unity Catalog mają domyślny katalog ustawiony na poziomie obszaru roboczego. Zobacz Zarządzanie domyślnym katalogiem.

W poniższej tabeli opisano konfiguracje produktów usługi Databricks, które mogą zastąpić domyślny wykaz obszarów roboczych:

Produkt Konfiguracja
Obliczenia uniwersalne lub dla zadań Ustaw konfigurację Spark spark.databricks.sql.initial.catalog.namespace podczas konfigurowania obliczeń.
Tabele na żywo delty Wykaz i schemat określony podczas konfiguracji potoku zastępują wartości domyślne obszaru roboczego dla całej logiki potoku.

Uwaga

Domyślny wykaz lub schemat mogą być również ustawiane przez konfiguracje JDBC podczas nawiązywania połączenia z systemami zewnętrznymi lub magazynami metadanych. Skontaktuj się z administratorem odpowiedzialnym za skonfigurowanie zasobów obliczeniowych i zintegrowanych systemów usługi Databricks, jeśli wystąpi nieoczekiwane zachowanie domyślne.

Użyj składni USE CATALOG lub USE SCHEMA, aby określić bieżący wykaz lub schemat dla bieżącej sesji. Bieżący katalog lub schemat jest używany, gdy zapytanie lub instrukcja używa częściowo kwalifikowanego lub niekwalifikowanego identyfikatora.

Wypowiedź Wynik
USE CATALOG catalog_name Ustawia bieżący wykaz przy użyciu podanego catalog_name. Ustawia bieżący schemat na default.
USE SCHEMA schema_name Ustawia bieżący schemat przy użyciu podanego schema_name w bieżącym katalogu.
USE SCHEMA catalog_name.schema_name Ustaw bieżący katalog przy użyciu podanego catalog_name oraz bieżący schemat przy użyciu podanego schema_name.

Uwaga

Zapytania i polecenia korzystające z w pełni kwalifikowanych identyfikatorów do interakcji z obiektami, takimi jak tabele, widoki, funkcje lub modele, nie zmieniają bieżącego wykazu lub schematu i zawsze odwołują się do określonego obiektu.

Wykonywanie zapytań o dane według ścieżki

Zapytania dotyczące danych ustrukturyzowanych, częściowo ustrukturyzowanych i nieustrukturyzowanych można wykonywać przy użyciu ścieżek plików. Większość plików w usłudze Azure Databricks jest wspierana przez magazyn obiektów w chmurze. Zobacz Praca z plikami w usłudze Azure Databricks.

Usługa Databricks zaleca skonfigurowanie całego dostępu do magazynu obiektów w chmurze przy użyciu katalogu aparatu Unity i zdefiniowanie woluminów dla lokalizacji magazynu obiektów, które są bezpośrednio odpytywane. Woluminy udostępniają aliasy czytelne dla człowieka do lokalizacji i plików w magazynie obiektów w chmurze przy użyciu nazw katalogów i schematów ścieżki plików. Zobacz Połącz się z chmurową pamięcią obiektową i usługami za pomocą Unity Catalog.

W poniższych przykładach pokazano, jak używać ścieżki woluminów katalogu Unity do odczytywania danych JSON.

SQL

SELECT * FROM json.`/Volumes/catalog_name/schema_name/volume_name/path/to/data`

Python

spark.read.format("json").load("/Volumes/catalog_name/schema_name/volume_name/path/to/data")

W przypadku lokalizacji w chmurze, które nie są skonfigurowane jako woluminy Unity Catalog, można wykonywać zapytania dotyczące danych bezpośrednio przy użyciu URI. Należy skonfigurować dostęp do magazynu obiektów w chmurze w celu wykonywania zapytań dotyczących danych przy użyciu identyfikatorów URI. Zobacz Konfigurowanie dostępu do magazynu obiektów w chmurze dla usługi Azure Databricks.

W poniższych przykładach pokazano, jak używać identyfikatorów URI do wykonywania zapytań dotyczących danych JSON w usłudze Azure Data Lake Storage Gen2, GCS i S3:

SQL

SELECT * FROM json.`abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/data`;

SELECT * FROM json.`gs://bucket_name/path/to/data`;

SELECT * FROM json.`s3://bucket_name/path/to/data`;

Python

spark.read.format("json").load("abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/data")

spark.read.format("json").load("gs://bucket_name/path/to/data")

spark.read.format("json").load("s3://bucket_name/path/to/data")

Wykonywanie zapytań dotyczących danych przy użyciu usługi SQL Warehouse

Usługa Azure Databricks używa magazynów SQL do obliczeń w następujących interfejsach:

  • Edytor SQL
  • Zapytania SQL usługi Databricks
  • Pulpity nawigacyjne
  • Starsze pulpity nawigacyjne
  • Alerty SQL

Opcjonalnie można używać magazynów SQL z następującymi produktami:

  • Notesy usługi Databricks
  • Edytor plików usługi Databricks
  • Zadania usługi Databricks

Podczas wykonywania zapytań dotyczących danych za pomocą usługi SQL Warehouse można używać tylko składni SQL. Inne języki programowania i interfejsy API nie są obsługiwane.

W przypadku obszarów roboczych, które mają włączony Unity Catalog, magazyny SQL zawsze używają Unity Catalog do zarządzania dostępem do źródeł danych.

Większość zapytań uruchamianych w magazynach SQL jest kierowana do tabel. Zapytania skierowane do plików danych powinny używać woluminów katalogu Unity do zarządzania dostępem do lokalizacji przechowywania.

Używanie identyfikatorów URI bezpośrednio w zapytaniach uruchamianych w usłudze SQL Warehouse może prowadzić do nieoczekiwanych błędów.

Wykonywanie zapytań dotyczących danych przy użyciu obliczeń obliczeniowych lub zadań ogólnego przeznaczenia

Większość zapytań uruchamianych z notesów, przepływów pracy usługi Databricks i edytora plików jest uruchamiana względem klastrów obliczeniowych skonfigurowanych za pomocą środowiska Databricks Runtime. Te klastry można skonfigurować tak, aby działały interaktywnie lub wdrażać je jako zadania obliczeniowe , które zasilają przepływy pracy. Usługa Databricks zaleca, aby zawsze używać zadań obliczeniowych dla obciążeń nieinterakcyjnych.

Obciążenia interakcyjne i nieinterakcyjne

Wielu użytkowników uważa, że pomocne jest wyświetlanie wyników zapytań podczas przetwarzania przekształceń podczas opracowywania. Przeniesienie interakcyjnego obciążenia z obliczeń typu all-purpose do zadań obliczeniowych pozwala zaoszczędzić czas i koszty przetwarzania, usuwając zapytania, które wyświetlają wyniki.

Platforma Apache Spark używa leniwego wykonywania kodu, co oznacza, że wyniki są obliczane tylko w razie potrzeby, a wiele przekształceń lub zapytań względem źródła danych można zoptymalizować jako pojedyncze zapytanie, jeśli nie wymusisz wyników. Jest to kontrast z trybem wykonywania chętnego używanego w bibliotece pandas, który wymaga przetworzenia obliczeń w kolejności przed przekazaniem wyników do następnej metody.

Jeśli twoim celem jest zapisanie oczyszczonych, przekształconych, zagregowanych danych jako nowego zestawu danych, należy usunąć zapytania, które wyświetlają wyniki z kodu przed zaplanowaniem jego uruchomienia.

W przypadku małych operacji i małych zestawów danych czas i oszczędności kosztów mogą być marginalne. Mimo to przy dużych operacjach można zmarnować znaczne ilości czasu na obliczanie i drukowanie wyników do notesu, który może nie być ręcznie sprawdzany. Te same wyniki mogą być prawdopodobnie odpytywane z zapisanych danych wyjściowych przy prawie żadnym koszcie po ich zapisaniu.