Creare tabelle Hive e caricare i dati dall'archiviazione BLOB di Azure

Questo argomento presenta le query Hive generiche che consentono di creare tabelle Hive e di caricare i dati dall'archiviazione BLOB di Azure. Vengono inoltre fornite alcune linee guida sul partizionamento delle tabelle Hive e sull'uso della formattazione ORC per migliorare le prestazioni delle query.

Questo menu si collega ad argomenti che descrivono come inserire dati in ambienti di destinazione in cui i dati possono essere archiviati ed elaborati durante il Processo di analisi scientifica dei dati per i team (TDSP).

Prerequisiti

Questo articolo presuppone che l'utente abbia:

Caricare dati nell'archivio BLOB di Azure

Se è stata creata una macchina virtuale di Azure seguendo le istruzioni fornite nell'articolo Configurare una macchina virtuale di Azure per l'analisi avanzata, questo file di script deve essere stato scaricato nella directory C:\Users\<nome utente name>\Documents\Data Science Scripts della macchina virtuale. Affinché le query Hive siano pronte per l'invio, è necessario solo collegare il proprio schema dei dati e la configurazione dell'archiviazione BLOB di Azure ai campi appropriati.

Si supponga che i dati delle tabelle Hive siano in un formato tabulare non compresso e che i dati siano stati caricati nel contenitore predefinito (o in uno aggiuntivo) dell'account di archiviazione usato dal cluster Hadoop.

Se si desidera far pratica con i dati relativi alle corse dei Taxi di NYC, è necessario:

Come inviare query Hive

È possibile inviare query Hive mediante:

  1. Inviare le query Hive attraverso la riga di comando di Hadoop nel nodo head del cluster Hadoop
  2. Inviare le query Hive con l'editor Hive
  3. Inviare le query Hive con i comandi di Azure PowerShell

Le query Hive sono simili a SQL. Se si ha già familiarità con SQL, i fogli informativi per gli utenti di Hive possono rivelarsi utili.

Quando si invia una query Hive, è possibile controllare la destinazione dell'output, sia questo visualizzato sullo schermo o incluso in un file locale nel nodo head o in un BLOB di Azure.

1. Inviare le query Hive attraverso la riga di comando di Hadoop nel nodo head del cluster Hadoop

Se la query Hive è complessa e la si invia direttamente al nodo head del cluster Hadoop, il completamento dell'operazione sarà più rapido rispetto a quando l'invio viene effettuato con l'editor Hive o gli script di Azure PowerShell.

Accedere al nodo head del cluster Hadoop, aprire la riga di comando di Hadoop sul desktop del nodo head e immettere il comando cd %hive_home%\bin.

Esistono tre modi per inviare query Hive nella riga di comando di Hadoop:

  • Direttamente
  • Mediante i file con estensione hql
  • Con la console dei comandi di Hive

Inviare query Hive direttamente nella riga di comando di Hadoop

È possibile eseguire comandi come hive -e "<your hive query>; per inviare query Hive semplici direttamente nella riga di comando di Hadoop. In questo esempio, la casella rossa evidenzia il comando che consente di inviare la query Hive, mentre quella verde evidenzia l'output della query.

Creare un'area di lavoro

Inviare query nei file con estensione hql

Quando la query Hive è più complicata e presenta più righe, modificare le query nella riga di comando o nella console dei comandi di Hive non è pratico. Un'alternativa consiste nell'usare un editor di testo nel nodo head del cluster Hadoop per salvare le query Hive in un file con estensione hql in una directory locale del nodo head. Quindi la query Hive nel file con estensione hql può essere inviata usando l'argomento -f nel modo seguente:

hive -f "<path to the .hql file>"

Creare un'area di lavoro

Eliminare la visualizzazione relativa allo stato di avanzamento delle query Hive sullo schermo

Per impostazione predefinita, dopo l'invio della query Hive nella riga di comando di Hadoop, lo stato di avanzamento del processo di mapping e riduzione viene mostrato sullo schermo. Per eliminare la stampa della schermata di avanzamento del processo di mapping e riduzione, è possibile usare un argomento -S ("S" in lettere maiuscole) nella riga di comando nel modo seguente:

hive -S -f "<path to the .hql file>"

. hive -S -e ""

Inviare query Hive nella console dei comandi di Hive

Innanzitutto è possibile immettere la console dei comandi di Hive eseguendo il comando hive nella riga di comando di Hadoop, quindi inviare query Hive nella console dei comandi di Hive. Di seguito è fornito un esempio. In questo esempio, le due caselle rosse evidenziano i comandi usati per inserire la console dei comandi di Hive e la query Hive inviata nella console dei comandi. La casella verde evidenzia l'output dalla query Hive.

Creare un'area di lavoro

Negli esempi precedenti, i risultati della query Hive vengono visualizzati direttamente sullo schermo. È anche possibile salvare l'output su un file locale nel nodo head o in un BLOB di Azure. Quindi, è possibile usare altri strumenti per analizzare ulteriormente l'output delle query Hive.

Restituire i risultati delle query Hive in un file locale. Per restituire i risultati delle query Hive in una directory locale nel nodo head, si deve inviare la query Hive nella riga di comando di Hadoop come indicato di seguito:

hive -e "<hive query>" > <local path in the head node>

Nell'esempio seguente, l'output della query Hive viene scritto in un file hivequeryoutput.txt all'interno della directory C:\apps\temp.

Creare un'area di lavoro

Restituire i risultati delle query Hive in un BLOB di Azure

Si può anche restituire i risultati della query Hive in un BLOB di Azure, nel contenitore predefinito del cluster Hadoop. In questo caso la query Hive del client è la seguente:

insert overwrite directory wasb:///<directory within the default container> <select clause from ...>

Nell'esempio seguente, l'output della query Hive viene scritto in una directory del BLOB queryoutputdir nel contenitore predefinito del cluster Hadoop. In questo caso, è sufficiente fornire il nome della directory, senza il nome del BLOB. Viene generato un errore se si specificano i nomi della directory e del BLOB, ad esempio wasb:///queryoutputdir/queryoutput.txt.

Creare un'area di lavoro

Se si apre il contenitore predefinito del cluster Hadoop usando Esplora archivi di Azure, è possibile visualizzare l'output della query Hive come indicato nell'immagine di seguito. È possibile applicare il filtro (evidenziato da una casella rossa) per recuperare solo il BLOB con le lettere specificate nei nomi.

Creare un'area di lavoro

2. Inviare le query Hive con l'editor Hive

È inoltre possibile usare la Console di Query (Editor Hive) immettendo un URL con formato https://<Hadoop cluster name>.azurehdinsight.net/Home/HiveEditor in un Web browser. La console è visualizzabile solo dopo aver eseguito l'accesso, pertanto è necessario disporre delle proprie credenziali del cluster Hadoop.

3. Inviare le query Hive con i comandi di Azure PowerShell

È possibile usare anche PowerShell per inviare le query Hive. Per istruzioni, vedere Invio di processi Hive tramite PowerShell.

Creare il database e le tabelle Hive

Le query Hive vengono condivise nell'archivio GitHub e possono essere scaricate da questa posizione.

Di seguito è presentata la query Hive che crea una tabella Hive.

create database if not exists <database name>;
CREATE EXTERNAL TABLE if not exists <database name>.<table name>
(
    field1 string,
    field2 int,
    field3 float,
    field4 double,
    ...,
    fieldN string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '<field separator>' lines terminated by '<line separator>'
STORED AS TEXTFILE LOCATION '<storage location>' TBLPROPERTIES("skip.header.line.count"="1");

Di seguito sono presentate le descrizioni dei campi da collegare e altre configurazioni:

  • <database name>: il nome del database che si desidera creare. Se si desidera usare solo il database predefinito, la query di creazione del database può essere omessa.
  • <table name>: il nome della tabella che si desidera creare nel database specificato. Se si desidera usare il database predefinito, è possibile fare direttamente riferimento alla tabella da <table name> senza <database name>.
  • <field separator>: il separatore che delimita i campi nel file di dati da caricare nella tabella Hive.
  • <line separator>: il separatore che delimita le righe nel file di dati.
  • <storage location>: il percorso di archiviazione di Azure in cui salvare i dati delle tabelle Hive. Se il parametro LOCATION <storage location> non viene specificato, il database e le tabelle vengono archiviati per impostazione predefinita nella directory hive/warehouse/ nel contenitore predefinito del cluster Hive. Se si desidera specificare il percorso di archiviazione, questo deve trovarsi nel contenitore predefinito per database e tabelle. Questo percorso deve essere definito come percorso relativo per il contenitore predefinito del cluster nel formato'wasb:///<directory 1>/' o 'wasb:///<directory 1>/<directory 2>/' e così via. Dopo l'esecuzione della query, vengono create le relative directory nel contenitore predefinito.
  • TBLPROPERTIES("skip.header.line.count"="1"): se il file di dati presenta una riga di intestazione, si deve aggiungere questa proprietà alla fine della query di creazione della tabella. In caso contrario, la riga di intestazione verrà caricata come un record nella tabella. Se il file di dati non presenta una riga di intestazione, questa configurazione può essere omessa nella query.

Caricare dati nelle tabelle Hive

Di seguito è presentata la query Hive che carica i dati in una tabella Hive.

LOAD DATA INPATH '<path to blob data>' INTO TABLE <database name>.<table name>;
  • <path to blob data>: se il file BLOB da caricare nella tabella Hive si trova nel contenitore predefinito del cluster Hadoop di HDInsight, <path to blob data> deve essere nel formato 'wasb:///<directory in this container>/<blob file name>'. Il file BLOB può trovarsi inoltre in un contenitore aggiuntivo del cluster Hadoop di HDInsight. In questo caso, <path to blob data> deve essere nel formato 'wasb://<container name>@<storage account name>.blob.core.windows.net/<blob file name>'.

    Nota

    I dati BLOB da caricare nella tabella Hive devono trovarsi nel contenitore predefinito o aggiuntivo dell'account di archiviazione del cluster Hadoop. In caso contrario, la query di LOAD DATA avrà esito negativo perché non può accedere ai dati.

Argomenti avanzati: Tabella partizionata e archiviazione dei dati Hive in formato ORC

Se i dati sono di grandi dimensioni, il partizionamento della tabella è utile per le query che devono solo eseguire l'analisi di alcune partizioni della tabella. Ad esempio, è ragionevole partizionare i dati di log di un sito Web per date.

Oltre al partizionamento delle tabelle Hive, è inoltre utile archiviare i dati Hive in formato ORC. Per altre informazioni sulla formattazione ORC, vedere l’uso dei file ORC per migliorare le prestazioni quando Hive legge, scrive ed elabora dati.

Tabella partizionata

Di seguito è presentata la query Hive che crea una tabella partizionata e vi carica i dati.

CREATE EXTERNAL TABLE IF NOT EXISTS <database name>.<table name>
(field1 string,
...
fieldN string
)
PARTITIONED BY (<partitionfieldname> vartype) ROW FORMAT DELIMITED FIELDS TERMINATED BY '<field separator>'
     lines terminated by '<line separator>' TBLPROPERTIES("skip.header.line.count"="1");
LOAD DATA INPATH '<path to the source file>' INTO TABLE <database name>.<partitioned table name>
    PARTITION (<partitionfieldname>=<partitionfieldvalue>);

Quando si interrogano tabelle partizionate, è opportuno aggiungere la condizione di partizione all'inizio della clausola where in modo da migliorare sensibilmente l'efficacia della ricerca.

select
    field1, field2, ..., fieldN
from <database name>.<partitioned table name>
where <partitionfieldname>=<partitionfieldvalue> and ...;

Archiviare i dati Hive in formato ORC

Non è possibile caricare direttamente i dati del BLOB nelle tabelle Hive nel formato di archiviazione ORC. Di seguito sono presentati i passaggi da eseguire per caricare dati dai BLOB Azure nelle tabelle Hive archiviate in formato ORC.

Creare una tabella esterna ARCHIVIATA COME TEXTFILE e caricare i dati dall'archiviazione BLOB nella tabella.

    CREATE EXTERNAL TABLE IF NOT EXISTS <database name>.<external textfile table name>
    (
        field1 string,
        field2 int,
        ...
        fieldN date
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '<field separator>'
        lines terminated by '<line separator>' STORED AS TEXTFILE
        LOCATION 'wasb:///<directory in Azure blob>' TBLPROPERTIES("skip.header.line.count"="1");

    LOAD DATA INPATH '<path to the source file>' INTO TABLE <database name>.<table name>;

Creare una tabella interna con lo stesso schema della tabella esterna nel passaggio 1, lo stesso delimitatore dei campi e archiviare i dati Hive in formato ORC.

    CREATE TABLE IF NOT EXISTS <database name>.<ORC table name>
    (
        field1 string,
        field2 int,
        ...
        fieldN date
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '<field separator>' STORED AS ORC;

Selezionare i dati della tabella esterna nel passaggio 1 e inserirli nella tabella ORC.

    INSERT OVERWRITE TABLE <database name>.<ORC table name>
        SELECT * FROM <database name>.<external textfile table name>;
Nota

Se la tabella TEXTFILE <database name>.<external textfile table name> presenta partizioni, al PASSAGGIO 3, il comando SELECT * FROM <database name>.<external textfile table name> selezionerà la variabile della partizione come un campo nel set di dati restituito. L'inserimento di tale tabella in <database name>.<ORC table name> avrà esito negativo poiché <database name>.<ORC table name> non dispone della variabile della partizione come campo nello schema della tabella. In questo caso, si devono selezionare i campi da inserire in <database name>.<ORC table name> come indicato di seguito:

    INSERT OVERWRITE TABLE <database name>.<ORC table name> PARTITION (<partition variable>=<partition value>)
       SELECT field1, field2, ..., fieldN
       FROM <database name>.<external textfile table name>
       WHERE <partition variable>=<partition value>;

È opportuno eliminare <external textfile table name> quando si usa la query seguente dopo che tutti i dati sono stati inseriti in <database name>.<ORC table name>:

    DROP TABLE IF EXISTS <database name>.<external textfile table name>;

Al termine della procedura, si disporrà di una tabella con i dati nel formato ORC pronta per l'uso.