2012-03-20 12 views
13

Mi piacerebbe eseguire istruzioni comeHive ha qualcosa di equivalente a DUAL?

SELECT date_add('2008-12-31', 1) FROM DUAL

fa Hive (in esecuzione su Amazon EMR) hanno qualcosa di simile?

+0

La maggior parte dei database non ha bisogno di uno pseudo come DUAL, solo Oracle. Allora, qual è la tua vera domanda, vuoi fare un'aritmetica data? – schlenk

+0

@schlenk Voglio solo qualcosa per eseguire le funzioni e fare il debug, dal momento che non ho molta familiarità con la lingua. – jbreed

risposta

4

C'è un bel working solution (beh, soluzione) disponibile nel link, ma è lento come si potrebbe immaginare.

L'idea è di creare una tabella con un campo fittizio, creare un file di testo il cui contenuto è solo "X", caricare quel testo in quella tabella. Viola.

CREATE TABLE dual (dummy STRING); 

load data local inpath '/path/to/textfile/dual.txt' overwrite into table dual; 

SELECT date_add('2008-12-31', 1) from dual; 
13

La migliore soluzione è non menzionare il nome della tabella.

select 1+1; 

Fornisce il risultato 2. Ma il povero Hive ha bisogno di generare mappe ridotte per trovarlo!

+0

Non ancora: hive> selezionare 1 + 1; FAILED: ParseException riga 1:14 ingresso non corrispondente '' in attesa di FROM vicino '1' in dalla clausola – teu

+1

Vecchio post ma vale la pena menzionare che questo è supportato nella versione 0.13 – Aaron

+0

questa è la più semplice, e funziona in scenari in cui uno non ha i diritti per creare una tabella. –

5

Per creare un doppio tavolo come in alveare in cui v'è una colonna e una riga è possibile effettuare le seguenti operazioni:

create table dual (x int); 
insert into table dual select count(*)+1 as x from dual; 

prova un'espressione:

select split('3,2,1','\\,') as my_new_array from dual; 

uscita:

["3","2","1"] 
2

Soluzione rapida:

Possiamo utilizzare la tabella esistente per ottenere la doppia funzionalità seguendo la query.

SELECT date_add('2008-12-31', 1) FROM <Any Existing Table> LIMIT 1 

Ad esempio:

SELECT CONCAT('kbdjj','56454') AS a, null AS b FROM tbl_name LIMIT 1 

Result

"limite 1" query viene utilizzata per evitare più occorrenze di valori specificati (kbdjj56454, NULL).

+0

SELECT CONCAT ('kbdjj', '56454') AS a, null AS b FROM (selezionare * da tbl_name LIMIT 1) t. Questa query sarà più efficiente –