Condividi tramite


Plug-in bag_unpack

Si applica a: ✅Microsoft FabricAzure Esplora dati

Il bag_unpack plug-in decomprime una singola colonna di tipo dynamic, trattando ogni slot di primo livello del contenitore delle proprietà come colonna. Il plug-in viene richiamato con l'operatore evaluate .

Sintassi

T|evaluatebag_unpack( Column [,OutputColumnPrefix ] [,columnsConflict ] [,ignoredProperties ] ) [:OutputSchema]

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Digita Obbligatorio Descrizione
T string ✔️ Input tabulare la cui colonna deve essere decompressa.
Istogramma dynamic ✔️ Colonna di T da decomprimere.
OutputColumnPrefix string Prefisso comune da aggiungere a tutte le colonne prodotte dal plug-in.
columnsConflict string Direzione per la risoluzione dei conflitti di colonna. Valori validi:
error - La query genera un errore (impostazione predefinita)
replace_source - La colonna di origine viene sostituita
keep_source - La colonna di origine viene mantenuta
ignoredProperties dynamic Set facoltativo di proprietà del contenitore da ignorare. }
OutputSchema Specificare i nomi e i tipi di colonna per l'output del plug-in bag_unpack . Per informazioni sulla sintassi, vedere Sintassi dello schema di output e per comprendere le implicazioni, vedere Considerazioni sulle prestazioni.

Sintassi dello schema di output

( ColumnName:ColumnType [, ...])

Usare un carattere jolly * come primo parametro per includere tutte le colonne della tabella di origine nell'output, come indicato di seguito:

( * , ColumnName:ColumnType [, ...])

Considerazioni sulle prestazioni

L'uso del plug-in senza outputSchema può avere gravi implicazioni sulle prestazioni in set di dati di grandi dimensioni e deve essere evitato.

La fornitura di un outputSchema consente al motore di query di ottimizzare l'esecuzione della query, in quanto può determinare lo schema di output senza dover analizzare e analizzare i dati di input. Ciò è utile quando i dati di input sono di grandi dimensioni o complessi. Vedere gli esempi con implicazioni sulle prestazioni dell'uso del plug-in con e senza un OutputSchema definito.

Valori restituiti

Il bag_unpack plug-in restituisce una tabella con il numero di record di input tabulare (T). Lo schema della tabella è uguale allo schema del relativo input tabulare con le modifiche seguenti:

  • La colonna di input specificata (colonna) viene rimossa.
  • Il nome di ogni colonna corrisponde al nome di ogni slot, facoltativamente preceduto da OutputColumnPrefix.
  • Il tipo di ogni colonna è il tipo dello slot, se tutti i valori dello stesso slot hanno lo stesso tipo o dynamic, se i valori differiscono nel tipo.
  • Lo schema viene esteso con il numero di colonne con cui sono presenti slot distinti nei valori del contenitore delle proprietà di primo livello di T.

Nota

  • Se non si specifica OutputSchema, lo schema di output del plug-in varia in base ai valori dei dati di input. Più esecuzioni del plug-in con input di dati diversi possono produrre schemi di output diversi.
  • Se viene specificato un outputSchema , il plug-in restituisce solo le colonne definite nella sintassi dello schema di output, a meno che non venga usato un carattere jolly * .
  • Per restituire tutte le colonne dei dati di input e le colonne definite in OutputSchema, usare un carattere jolly * in OutputSchema.

Le regole dello schema tabulare si applicano ai dati di input. In particolare:

  • Un nome di colonna di output non può essere uguale a una colonna esistente nell'input tabulare T, a meno che non sia la colonna da decomprimere (colonna). In caso contrario, l'output include due colonne con lo stesso nome.
  • Tutti i nomi degli slot, se preceduti da OutputColumnPrefix, devono essere nomi di entità validi e seguire le regole di denominazione degli identificatori.

Il plug-in ignora i valori Null.

Esempi

Negli esempi di questa sezione viene illustrato come usare la sintassi per iniziare.

Espandere un sacchetto:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d)

Risultato

Età Nome
20 John
40 Dave
30 Gelsomino

Espandere un contenitore e usare l'opzione OutputColumnPrefix per produrre nomi di colonna con un prefisso:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, 'Property_')

Risultato

Property_Age Property_Name
20 John
40 Dave
30 Gelsomino

Espandere un contenitore e usare l'opzione columnsConflict per risolvere un conflitto di colonna tra la colonna dinamica e la colonna esistente:

datatable(Name:string, d:dynamic)
[
    'Old_name', dynamic({"Name": "John", "Age":20}),
    'Old_name', dynamic({"Name": "Dave", "Age":40}),
    'Old_name', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='replace_source') // Use new name

Risultato

Età Nome
20 John
40 Dave
30 Gelsomino
datatable(Name:string, d:dynamic)
[
    'Old_name', dynamic({"Name": "John", "Age":20}),
    'Old_name', dynamic({"Name": "Dave", "Age":40}),
    'Old_name', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='keep_source') // Keep old name

Risultato

Età Nome
20 Old_name
40 Old_name
30 Old_name

Espandere un contenitore e usare l'opzione ignoredProperties per ignorare 2 delle proprietà nel contenitore delle proprietà:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20, "Address": "Address-1" }),
    dynamic({"Name": "Dave", "Age":40, "Address": "Address-2"}),
    dynamic({"Name": "Jasmine", "Age":30, "Address": "Address-3"}),
]
// Ignore 'Age' and 'Address' properties
| evaluate bag_unpack(d, ignoredProperties=dynamic(['Address', 'Age']))

Risultato

Nome
John
Dave
Gelsomino

Espandere un contenitore e usare l'opzione OutputSchema:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d) : (Name:string, Age:long)

Risultato

Nome Età
John 20
Dave 40
Gelsomino 30

Espandere un contenitore con un outputSchema e usare l'opzione con caratteri jolly*:

Questa query restituisce la descrizione dello slot originale e le colonne definite in OutputSchema.

datatable(d:dynamic, Description: string)
[
    dynamic({"Name": "John", "Age":20, "height":180}), "Student",
    dynamic({"Name": "Dave", "Age":40, "height":160}), "Teacher",
    dynamic({"Name": "Jasmine", "Age":30, "height":172}), "Student",
]
| evaluate bag_unpack(d) : (*, Name:string, Age:long)

Risultato

Descrizione Nome Età
Studente John 20
Docente Dave 40
Studente Gelsomino 30

Esempi con implicazioni sulle prestazioni

Espandere un contenitore con e senza un OutputSchema definito per confrontare le implicazioni per le prestazioni:

Questo esempio usa una tabella disponibile pubblicamente nel cluster della Guida. Nel database ContosoSales è presente una tabella denominata SalesDynamic. La tabella contiene dati sulle vendite e include una colonna dinamica denominata Customer_Properties.

Screenshot della tabella SalesDynamic con la colonna delle proprietà del cliente evidenziata.

  • Esempio senza schema di output: la prima query non definisce un outputSchema. La query richiede 5,84 secondi di CPU e analizza 36,39 MB di dati.

    SalesDynamic
    | evaluate bag_unpack(Customer_Properties) 
    | summarize Sales=sum(SalesAmount) by Country, State
    
  • Esempio con schema di output: la seconda query fornisce un outputSchema. La query richiede 0,45 secondi di CPU e analizza 19,31 MB di dati. La query non deve analizzare la tabella di input, risparmiando tempo di elaborazione.

    SalesDynamic
    | evaluate bag_unpack(Customer_Properties) :  (*, Country:string, State:string, City:string)
    | summarize Sales=sum(SalesAmount) by Country, State
    

Risultato

L'output è lo stesso per entrambe le query. Di seguito sono riportate le prime 10 righe dell'output.

Canada Columbia Britannica 56,101,083
Regno Unito Inghilterra 77,288,747
Australia Victoria 31,242,423
Australia Queensland 27,617,822
Australia Australia Meridionale 8,530,537
Australia Nuovo Galles meridionale 54,765,786
Australia Tasmania 3,704,648
Canada Alberta 375,061
Canada Ontario 38,282
Stati Uniti Washington 80,544,870
... ... ...