2013-07-29 19 views
9

Qualcuno può dirmi a cosa serve la query --split-by e boundary in sqoop?quali sono i seguenti comandi in sqoop?

Sqoop importazione jdbc --connect: mysql: // localhost/il mio utente --username --password 1234 --query 'select * from tabella in cui id = 5 e $ CONDIZIONI' --split-by tavolo .id --target-dir/dir

risposta

28

--split-by: Viene utilizzato per specificare la colonna di la tabella utilizzata per generare divisioni per le importazioni. Ciò significa che specifica quale colonna verrà utilizzata per creare la divisione durante l'importazione dei dati nel cluster. Può essere utilizzato per migliorare le prestazioni di importazione ottenendo un maggiore parallelismo. Sqoop crea divisioni basate su valori in una particolare colonna della tabella che viene specificata da --split-by dall'utente tramite il comando di importazione. Se non è disponibile, la chiave primaria della tabella di input viene utilizzata per creare le suddivisioni.

Motivo da utilizzare: A volte la chiave primaria non ha una distribuzione uniforme dei valori tra i valori minimo e massimo (che viene utilizzato per creare gli split se --split-by non è disponibile). In tale situazione è possibile specificare un'altra colonna che abbia una corretta distribuzione dei dati per creare suddivisioni per importazioni efficienti.

--boundary-query: Per impostazione predefinita Sqoop useranno query di select min(), max() da per scoprire i limiti per la creazione di spaccature. In alcuni casi questa query non è la più ottimale, quindi è possibile specificare qualsiasi query arbitraria restituendo due colonne numeriche utilizzando l'argomento --boundary-query.

Motivo per l'uso: Se --split-by non fornisce le prestazioni ottimali, è possibile utilizzarlo per migliorare ulteriormente le prestazioni.

10

Sqoop consente di importare i dati in parallelo e --split-by e --boundary-query consentono un maggiore controllo. Se si sta solo importando una tabella, verrà utilizzato il CHIAVE PRIMARIO, tuttavia se si sta eseguendo una query più avanzata, sarà necessario specificare la colonna per eseguire la divisione parallela.

cioè

sqoop import \ 
    --connect 'jdbc:mysql://.../...' \ 
    --direct \ 
    --username uname --password pword \ 
    --hive-import \ 
    --hive-table query_import \ 
    --boundary-query 'SELECT 0, MAX(id) FROM a' \ 
    --query 'SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND $CONDITIONS'\ 
    --num-mappers 3 
    --split-by a.id \ 
    --target-dir /data/import \ 
    --verbose 

Boundary Query consente di specificare una query ottimizzata per ottenere il max, min. altrimenti tenterà di eseguire MIN (a.id), MAX (a.id) sulla tua istruzione --query.

i risultati saranno (se min = 0, max = 30) è di 3 interrogazioni che vengono eseguite in parallelo:

SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 0 AND 10; 
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 11 AND 20; 
SELECT a.id, a.name, b.id, b.name FROM a, b WHERE a.id = b.id AND a.id BETWEEN 21 AND 30; 
+0

Siamo spiacenti. Ancora non capisco. Cos'è --split-by? è come, qualcosa a che fare con l'elaborazione del comando? – DrewRose

16

--split-by utilizzato per distribuire i valori dalla tabella di tutti i mappatori uniformemente cioè dire u ha 100 record unici (chiave primaria) e se vi sono 4 mappatori, --split-by (colonna chiave primaria) contribuirà a distribuire il set di dati in modo uniforme tra i mappatori.

$ CONDIZIONI viene utilizzato dal processo Sqoop, verrà sostituito con un'espressione di condizione univoca internamente per ottenere il set di dati. Se si esegue un'importazione parallela, le attività della mappa eseguiranno la query con valori diversi sostituiti con $ CONDITIONS. ad esempio, un mappatore può eseguire "seleziona bla da foo WHERE (id> = 0 AND id < 10000)", e il prossimo mapper può eseguire "seleziona bla da foo WHERE (id> = 10000 AND id < 20000)" e così via .

1

anche se specifichiamo --query valore tra virgolette (" "), abbiamo bisogno di far precedere $CONDITIONS con un slash(\)

--query "select * from table where id=5 AND \$CONDITIONS" 

oppure

--query 'select * from table where id=5 AND $CONDITIONS' 
0

--split-by clausola viene utilizzato per specificare le colonne della tabella utilizzate per generare divisioni per le importazioni di dati. Questa clausola specifica le colonne che verranno utilizzate per la divisione durante l'importazione dei dati nel cluster Hadoop. La clausola -split-by consente di ottenere prestazioni migliorate attraverso un maggiore parallelismo. Apache Sqoop creerà le suddivisioni in base ai valori presenti nelle colonne specificate nella clausola -split-by del comando di importazione. Se la clausola -split-by non viene specificata, la chiave primaria della tabella viene utilizzata per creare le divisioni durante l'importazione dei dati. A volte la chiave primaria della tabella potrebbe non avere valori distribuiti uniformemente tra l'intervallo minimo e massimo. In tali circostanze, la clausola -split-by può essere utilizzata per specificare un'altra colonna che dispone di una distribuzione uniforme dei dati per creare divisioni in modo che l'importazione dei dati sia efficiente.

Problemi correlati