2014-07-22 35 views
5

Sto cercando di creare una tabella in HivePosso raggruppare per/bucket una tabella creata tramite "CREATE TABLE AS SELECT ....." in Hive?

CREATE TABLE BUCKET_TABLE AS 
SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS NUll 
CLUSTERED BY (key) INTO 1000 BUCKETS; 

Questa sintassi sta venendo a mancare - ma non sono sicuro se è ancora possibile fare questa dichiarazione combinato. Qualche idea?

+0

provare CREATE TABLE BUCKET_TABLE in cluster (chiave) in 1000 BUCKETS AS SELECT a * da table1 un LEFT JOIN TABLE2 b ON (a.key = b.key) WHERE IS NULL b.key .; –

+0

@patrick genera errore FAILED: SemanticException [Errore 10068]: CREATE-TABLE-AS-SELECT non supporta il partizionamento nella tabella di destinazione .. hai provato? –

risposta

4

È arrivata a questa domanda e ho visto che non c'era risposta fornita. Ho guardato oltre e ho trovato la risposta nella documentazione di Hive.

Questo non sarà mai funzionato, a causa dei seguenti restrizioni sulla CTAS:

  1. La tabella di destinazione non può essere una tabella partizionata.
  2. La tabella di destinazione non può essere una tabella esterna.
  3. La tabella di destinazione non può essere una tabella di bucket di elenco.

Fonte: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTableAsSelect%28CTAS

Inoltre https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [. Nome_db] nome_tabella
...
[in cluster (nome_col, nome_col, ...) [SORTED BY (col_name [ASC | DESC], ...)] INTO num_buckets BENNE]
...
[AS select_statement];

Il clustering richiede che la colonna sia definita e quindi il cfg passa a Come select_statement Pertanto in questo momento non è possibile.

In alternativa, è possibile ALTERARE la tabella e aggiungere bucket, ma ciò non modifica i dati esistenti.

CREATE TABLE BUCKET_TABLE 
STORED AS ORC AS 
SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS NUll limit 0; 
ALTER TABLE BUCKET_TABLE CLUSTERED BY (key) INTO 1000 BUCKETS; 
ALTER TABLE BUCKET_TABLE SET TBLPROPERTIES ('transactional'='true'); 
INSERT INTO BUCKET_TABLE 
SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS NUll; 
0

È necessario utilizzare una colonna non null nella clausola clustered by.

+0

Questo mi dà lo stesso errore di sintassi (FAILED: ParseException riga 1: 235 EOF mancante a 'clustered' vicino a 'NULL' (stato = 42000, codice = 40000)) – Andrew

+0

@Andrew questo non funziona per te dato che stai selezionando le righe da table1 dove le chiavi sono nulle e quindi usando clusterd by su quelle chiavi nulle. Raggruppato da dovrebbe essere eseguito su una colonna non null. –

+0

No, le chiavi table1 non sono nulle nella query. i tasti table2 sono. – Andrew

0

Sembra impossibile. Quando si cerca di trasmettere tali query per Ambari:

CREATE TABLE ready_requests 
CLUSTERED BY (device) INTO 64 BUCKETS 
as 
SELECT ...; 

mi sono qualcosa come: "CREATE-TABLE-AS-SELECT non supporta il partizionamento nella tabella di destinazione" Anche non è corretto messaggio, sguardi come il bucket è, inoltre, non supportata

c'è la documentazione che le partizioni non sono supportati, vedere link, per benne, non c'è tali informazioni, ma sembra che abbiamo lo stesso problema