2016-02-28 18 views
8

sqoop import --connect jdbc:teradata://192.168.xx.xx/DBS_PORT=1025,DATABASE=ds_tbl_db --driver com.teradata.jdbc.TeraDriver --username dbc --password dbc --query 'select * from reason where id>20' --hive-import --hive-table reason_hive --target-dir <hdfs-location> -m 1Sqoop importazione con query SQL con cui la clausola

ho ottenuto l'errore:

Query [select * from reason where id>20] must contain '$CONDITIONS' in WHERE clause.

so che ci deve essere una clausola WHERE nella query per Sqoop.

Così, per le query come

select * from reason

ho modificarlo per:

select * from reason WHERE $CONDITIONS

Cosa fare per le query che hanno where clausola?

risposta

16

si deve aggiungere AND \$CONDITIONS

--query "select * from reason where id>20 AND \$CONDITIONS"

prega di fare riferimento Sqoop documentation.

+2

'E \ $ CONDITIONS' è necessario se si è chiusa la query in doppia citazioni. altrimenti usa 'E $ CONDIZIONI' –

3

Sqoop richiede l'accesso ai metadati della tabella, ad esempio informazioni sul tipo di colonna. Placeholder $ CONDITIONS è impostato di default su '1 = 0' per garantire che sqoop riceva solo informazioni sul tipo. Quindi, dopo aver eseguito il comando sqoop, vedrai che la prima query che viene generata è con $ CONDITIONS predefinite. Successivamente, viene sostituito da valori diversi che definiscono intervalli diversi in base al numero di mapper (-m) o --split-by column o --boundary-query in modo che l'intero set di dati possa essere diviso in diverse sezioni di dati o blocchi e blocchi può essere importato in parallelo con tanto quanto la concorrenza disponibile. Sqoop sostituirà automaticamente questo segnaposto con le condizioni generate specificando quale porzione di dati deve essere trasferita da ogni singola attività

Ad esempio, si consideri la tabella sample_data con nome di colonne, id e salario. Si desidera recuperare i record con lo stipendio> 1k.

sqoop import \ 
    --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \ 
    --username retail_dba --password cloudera \ 
    --query 'select * from sample_data where $CONDITIONS AND salary > 1000' \ 
    --split-by salary \ 
    --target-dir hdfs://quickstart.cloudera/user/cloudera/sqoop_new 

Di seguito è la prima query che restituisce il set vuoto.

SqlManager: Executing SQL statement: select * from sample_data where (1 = 0) AND salary > 1000 

Quindi la query successiva è ottenere min e max di intervallo.

INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(salary), MAX(salary) FROM (select * from sample_data where (1 = 1) AND salary > 1000) AS t1;