Fråga efter data i Azure Data Lake med hjälp av Azure Data Explorer

Azure Data Lake Storage är en mycket skalbar och kostnadseffektiv data lake-lösning för stordataanalys. Den kombinerar kraften i ett högpresterande filsystem med massiv skala och ekonomi för att hjälpa dig att minska din tid till insikter. Data Lake Storage Gen2 utökar Azure Blob Storage och är optimerad för analysarbetsbelastningar.

Azure Data Explorer integreras med Azure Blob Storage och Azure Data Lake Storage (Gen1 och Gen2), vilket ger snabb, cachelagrad och indexerad åtkomst till data som lagras i extern lagring. Du kan analysera och fråga efter data utan föregående inmatning till Azure Data Explorer. Du kan också köra frågor mot inlästa och ejesterade externa data samtidigt.

Tips

Den bästa frågeprestandan kräver datainmatning till Azure Data Explorer. Möjligheten att fråga efter externa data utan föregående inmatning bör endast användas för historiska data eller data som sällan efterfrågas. Optimera dina externa datafrågeprestanda för bästa resultat.

Skapa en extern tabell

Anta att du har många CSV-filer som innehåller historisk information om produkter som lagras i ett lager och du vill göra en snabbanalys för att hitta de fem populäraste produkterna från förra året. I det här exemplet ser CSV-filerna ut så här:

Timestamp ProductId ProductDescription
2019-01-01 11:21:00 TO6050 3,5in DS/HD-diskett
2019-01-01 11:30:55 YDX1 Dx1-syntetiserare
... ... ...

Filerna lagras i Azure Blob Storage mycompanystorage under en container med namnet , archivedproducts partitionerad efter datum:

https://mycompanystorage.blob.core.windows.net/archivedproducts/2019/01/01/part-00000-7e967c99-cf2b-4dbb-8c53-ce388389470d.csv.gz
https://mycompanystorage.blob.core.windows.net/archivedproducts/2019/01/01/part-00001-ba356fa4-f85f-430a-8b5a-afd64f128ca4.csv.gz
https://mycompanystorage.blob.core.windows.net/archivedproducts/2019/01/01/part-00002-acb644dc-2fc6-467c-ab80-d1590b23fc31.csv.gz
https://mycompanystorage.blob.core.windows.net/archivedproducts/2019/01/01/part-00003-cd5fad16-a45e-4f8c-a2d0-5ea5de2f4e02.csv.gz
https://mycompanystorage.blob.core.windows.net/archivedproducts/2019/01/02/part-00000-ffc72d50-ff98-423c-913b-75482ba9ec86.csv.gz
...

Om du vill köra en KQL-fråga direkt på dessa CSV-filer använder du kommandot för att definiera .create external table en extern tabell i Azure Data Explorer. Mer information om kommandoalternativen för att skapa externa tabeller finns i kommandon för externa tabeller.

.create external table ArchivedProducts(Timestamp:datetime, ProductId:string, ProductDescription:string)   
kind=blob            
partition by (Date:datetime = bin(Timestamp, 1d))   
dataformat=csv   
(   
  h@'https://mycompanystorage.blob.core.windows.net/archivedproducts;StorageSecretKey'
)    

Den externa tabellen visas nu i den vänstra rutan i webbgränssnittet:

Extern tabell i webbgränssnittet.

Behörigheter för extern tabell

  • Databasanvändaren kan skapa en extern tabell. Tabellskaparen blir automatiskt tabelladministratör.
  • Klustret, databasen eller tabelladministratören kan redigera en befintlig tabell.
  • Alla databasanvändare eller läsare kan köra frågor mot en extern tabell.

Köra frågor mot en extern tabell

När en extern tabell har definierats external_table() kan funktionen användas för att referera till den. Resten av frågan är standardspråket Kusto Query.

external_table("ArchivedProducts")   
| where Timestamp > ago(365d)   
| summarize Count=count() by ProductId,   
| top 5 by Count

Köra frågor mot externa och in matade data tillsammans

Du kan fråga både externa tabeller och indatatabeller inom samma fråga. Du kan join eller den externa tabellen med ytterligare data från union Azure Data Explorer, SQL-servrar eller andra källor. Använd en let( ) statement för att tilldela ett kortnamn till en extern tabellreferens.

I exemplet nedan är Products en intagen datatabell och ArchivedProducts är en extern tabell som vi har definierat tidigare:

let T1 = external_table("ArchivedProducts") |  where TimeStamp > ago(100d);   
let T = Products; //T is an internal table   
T1 | join T on ProductId | take 10

Köra frågor mot hierarkiska dataformat

Azure Data Explorer kan köra frågor mot hierarkiska format, till exempel JSONParquet , , och AvroORC . Om du vill mappa hierarkiskt dataschema till ett externt tabellschema (om det är annorlunda) använder du kommandona för extern tabellmappning. Om du till exempel vill köra frågor mot JSON-loggfiler med följande format:

{
  "timestamp": "2019-01-01 10:00:00.238521",   
  "data": {    
    "tenant": "e1ef54a6-c6f2-4389-836e-d289b37bcfe0",   
    "method": "RefreshTableMetadata"   
  }   
}   
{
  "timestamp": "2019-01-01 10:00:01.845423",   
  "data": {   
    "tenant": "9b49d0d7-b3e6-4467-bb35-fa420a25d324",   
    "method": "GetFileList"   
  }   
}
...

Definitionen av den externa tabellen ser ut så här:

.create external table ApiCalls(Timestamp: datetime, TenantId: guid, MethodName: string)
kind=blob
dataformat=multijson
( 
   h@'https://storageaccount.blob.core.windows.net/container1;StorageSecretKey'
)

Definiera en JSON-mappning som mappar datafält till externa tabelldefinitionsfält:

.create external table ApiCalls json mapping 'MyMapping' '[{"Column":"Timestamp","Properties":{"Path":"$.timestamp"}},{"Column":"TenantId","Properties":{"Path":"$.data.tenant"}},{"Column":"MethodName","Properties":{"Path":"$.data.method"}}]'

När du frågar den externa tabellen anropas mappningen och relevanta data mappas till de externa tabellkolumnerna:

external_table('ApiCalls') | take 10

Mer information om mappningssyntax finns i datamappningar.

Fråga en extern TaxiRides-tabell i hjälpklustret

Använd testklustret som kallas hjälp för att prova Azure Data Explorer funktioner. Hjälpklustret innehåller en extern tabelldefinition för en datamängd för New York City-taxi som innehåller miljarder taxiresor.

Skapa TaxiRides för extern tabell

Det här avsnittet visar frågan som används för att skapa den externa tabellen TaxiRides i hjälpklustret. Eftersom den här tabellen redan har skapats kan du hoppa över det här avsnittet och gå direkt till frågan TaxiRides externa tabelldata.

.create external table TaxiRides
(
  trip_id: long,
  vendor_id: string, 
  pickup_datetime: datetime,
  dropoff_datetime: datetime,
  store_and_fwd_flag: string,
  rate_code_id: int,
  pickup_longitude: real,
  pickup_latitude: real,
  dropoff_longitude: real,
  dropoff_latitude: real,
  passenger_count: int,
  trip_distance: real,
  fare_amount: real,
  extra: real,
  mta_tax: real,
  tip_amount: real,
  tolls_amount: real,
  ehail_fee: real,
  improvement_surcharge: real,
  total_amount: real,
  payment_type: string,
  trip_type: int,
  pickup: string,
  dropoff: string,
  cab_type: string,
  precipitation: int,
  snow_depth: int,
  snowfall: int,
  max_temperature: int,
  min_temperature: int,
  average_wind_speed: int,
  pickup_nyct2010_gid: int,
  pickup_ctlabel: string,
  pickup_borocode: int,
  pickup_boroname: string,
  pickup_ct2010: string,
  pickup_boroct2010: string,
  pickup_cdeligibil: string,
  pickup_ntacode: string,
  pickup_ntaname: string,
  pickup_puma: string,
  dropoff_nyct2010_gid: int,
  dropoff_ctlabel: string,
  dropoff_borocode: int,
  dropoff_boroname: string,
  dropoff_ct2010: string,
  dropoff_boroct2010: string,
  dropoff_cdeligibil: string,
  dropoff_ntacode: string,
  dropoff_ntaname: string,
  dropoff_puma: string
)
kind=blob 
partition by (Date:datetime = bin(pickup_datetime, 1d))   
dataformat=csv
( 
    h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)

Du hittar den skapade TaxiRides-tabellen genom att titta i den vänstra rutan i webbgränssnittet:

Taxiresor med extern tabell.

Fråga TaxiRides externa tabelldata

Logga in på https://dataexplorer.azure.com/clusters/help/databases/Samples.

Fråga en extern TaxiRides-tabell utan partitionering

Kör den här frågan på den externa tabellen TaxiRides för att visa resor för varje dag i veckan, i hela datauppsättningen.

external_table("TaxiRides")
| summarize count() by dayofweek(pickup_datetime)
| render columnchart

Den här frågan visar den mest trafikerade dagen i veckan. Eftersom data inte är partitionerade kan det ta upp till flera minuter innan frågan returnerar resultat.

rendera icke-partitionerad fråga.

Fråga en extern TaxiRides-tabell med partitionering

Kör den här frågan på den externa tabellen TaxiRides för att visa taxibilstyper (gul eller grön) som användes i januari 2017.

external_table("TaxiRides")
| where pickup_datetime between (datetime(2017-01-01) .. datetime(2017-02-01))
| summarize count() by cab_type
| render piechart

Den här frågan använder partitionering, vilket optimerar frågetid och prestanda. Frågan filtrerar på en partitionerad kolumn (pickup_datetime) och returnerar resultat inom några sekunder.

Rendera partitionerad fråga.

Du kan skriva ytterligare frågor som ska köras på den externa tabellen TaxiRides och lära dig mer om data.

Optimera frågeprestanda

Optimera dina frågeprestanda i lake med hjälp av följande metodtips för att köra frågor mot externa data.

Dataformat

  • Använd ett kolumnformat för analysfrågor av följande skäl:
    • Endast de kolumner som är relevanta för en fråga kan läsas.
    • Tekniker för kolumnkodning kan minska datastorleken avsevärt.
  • Azure Data Explorer har stöd för parquet- och ORC-kolumnformat. Parquet-format föreslås på grund av optimerad implementering.

Azure-region

Kontrollera att externa data finns i samma Azure-region som Azure Data Explorer klustret. Den här konfigurationen minskar kostnaden och hämtningstiden för data.

Filstorlek

Den optimala filstorleken är hundratals MB (upp till 1 GB) per fil. Undvik många små filer som kräver onödiga omkostnader, till exempel långsammare filuppräkningsprocess och begränsad användning av kolumnformat. Antalet filer ska vara större än antalet processorkärnor i ditt Azure Data Explorer kluster.

Komprimering

Använd komprimering för att minska mängden data som hämtas från fjärrlagringen. För Parquet-format använder du den interna Parquet-komprimeringsmekanismen som komprimerar kolumngrupper separat, så att du kan läsa dem separat. Kontrollera att filerna har följande namn för att verifiera användningen av komprimeringsmekanismen: > filnamnet .gz.parquet eller > och inte <.

Partitionering

Organisera dina data med hjälp av "mapppartitioner" som gör att frågan kan hoppa över irrelevanta sökvägar. När du planerar partitionering bör du överväga filstorlek och vanliga filter i dina frågor, till exempel tidsstämpel eller klientorganisations-ID.

Storlek på virtuell dator

Välj VM-SKU:er med fler kärnor och högre nätverksgenomflöde (minnet är mindre viktigt). Mer information finns i Välja rätt VM SKU för ditt Azure Data Explorer kluster.

Nästa steg

  • Fråga dina data i Azure Data Lake med hjälp av Azure Data Explorer. Lär dig att skriva frågor och härleda ytterligare insikter från dina data.