Jak mogę wypisać wyniki zapytania HiveQL do pliku CSV?

Chcielibyśmy umieścić wyniki zapytania Hive w pliku CSV. Myślałem, że komenda powinna wyglądać tak:

insert overwrite directory '/home/output.csv' select books from table;

Kiedy go uruchamiam, mówi, że zakończył się pomyślnie, ale nigdy nie mogę znaleźć pliku. Jak mogę znaleźć ten plik lub powinienem wyodrębniać dane w inny sposób?

Dzięki!
Author: Vldb.User, 2013-08-08

10 answers

Chociaż możliwe jest użycie INSERT OVERWRITE, Aby uzyskać dane z Hive, może to nie być najlepsza metoda w twoim konkretnym przypadku. Najpierw wyjaśnię, co robi INSERT OVERWRITE, potem opiszę metodę, której używam do pobierania plików tsv z tabel Hive.

Zgodnie z instrukcją , Twoje zapytanie będzie przechowywać dane w katalogu w HDFS. Format nie będzie csv.

Dane zapisywane do systemu plików są serializowane jako tekst z kolumnami oddzielonymi ^A, a wiersze oddzielone newlines. Jeśli którakolwiek z kolumn nie jest typu prymitywnego, to kolumny te są serializowane do formatu JSON.

Niewielka modyfikacja (dodanie słowa kluczowego LOCAL) będzie przechowywać dane w lokalnym katalogu.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;

Kiedy uruchamiam podobne zapytanie, oto jak wygląda wyjście.

[lvermeer@hadoop temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug  9 09:21 000000_0
[lvermeer@hadoop temp]$ head 000000_0 
"row1""col1"1234"col3"1234FALSE
"row2""col1"5678"col3"5678TRUE

Osobiście Zwykle uruchamiam moje zapytanie bezpośrednio przez Hive w linii poleceń dla tego typu rzeczy i przesyłam je do lokalnego pliku w ten sposób:

hive -e 'select books from table' > /home/lvermeer/temp.tsv

To daje mi plik oddzielony tabulatorami, którego mogę użyć. Mam nadzieję, że jest to również przydatne dla Ciebie.

Bazując na ten patch-3682 , podejrzewam, że lepsze rozwiązanie jest dostępne przy użyciu Hive 0.11, ale sam nie jestem w stanie tego przetestować. Nowa składnia powinna umożliwiać następujące czynności.

INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
select books from table;
Mam nadzieję, że to pomoże.
 138
Author: Lukas Vermeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 07:44:12

Jeśli chcesz mieć plik CSV, możesz zmodyfikować rozwiązania Lukasa w następujący sposób (zakładając, że jesteś na Linuksie):

hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
 21
Author: David Kjerrumgaard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 19:43:48

Aby utworzyć katalog w HDFS z plikami zawierającymi wyniki zapytania, należy użyć polecenia CREATE TABLE AS SELECT (CTAS). Następnie będziesz musiał wyeksportować te pliki z HDFS na zwykły dysk i scalić je w jeden plik.

Być może będziesz musiał zrobić kilka sztuczek, aby przekonwertować pliki z' \001 ' - rozdzielane do CSV. Możesz użyć niestandardowego serwera CSV lub przetworzyć wyodrębniony plik.

 4
Author: Olaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 17:23:40

Jeśli używasz HUE, jest to również dość proste. Po prostu przejdź do edytora Hive w HUE, wykonaj zapytanie hive, a następnie zapisz plik wynikowy lokalnie jako XLS lub CSV, lub możesz zapisać plik wynikowy do HDFS.

 3
Author: Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-29 18:00:38

Szukałem podobnego rozwiązania, ale te, o których tu mowa, nie zadziałały. Moje dane miały wszystkie odmiany znaków spacji (spacja, znak nowej linii, tabulator) i przecinków.

Aby dane kolumny były bezpieczne, zamieniłem wszystkie znaki \t w danych kolumny spacją i wykonałem kod Pythona w wierszu poleceń, aby wygenerować plik csv, jak pokazano poniżej:

hive -e 'tab_replaced_hql_query' |  python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")'

To stworzyło doskonale poprawny plik csv. Mam nadzieję, że pomoże to tym, którzy przychodzą szukać tego rozwiązania.

 3
Author: sisanared,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-27 00:49:34

Możesz użyć funkcji hive string CONCAT_WS( string delimiter, string str1, string str2...strn )

Dla ex:

hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
 3
Author: Ram Ghadiyaram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 07:26:20

Możesz użyć INSERT ... DIRECTORY ..., jak w tym przykładzie:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';

OVERWRITE i LOCAL mają takie same interpretacje jak poprzednio, a ścieżki są interpretowane zgodnie ze zwykłymi zasadami. Jeden lub więcej plików zostanie zapisanych do /tmp/ca_employees, w zależności od liczby wywoływanych reduktorów.

 2
Author: bigmakers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 07:42:20

Miałem podobny problem i w ten sposób udało mi się go rozwiązać.

Krok 1 - załadowanie danych z tabeli Hive do innej tabeli w następujący sposób

DROP TABLE IF EXISTS TestHiveTableCSV;
CREATE TABLE TestHiveTableCSV 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n' AS
SELECT Column List FROM TestHiveTable;

Krok 2 - skopiowanie Bloba z magazynu Ula do nowej lokalizacji z odpowiednim rozszerzeniem

Start-AzureStorageBlobCopy
-DestContext $destContext 
-SrcContainer "Source Container"
-SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
 2
Author: Dattatrey Sindol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 12:48:27

Domyślnym separatorem jest " ^A". W języku python jest to "\x01".

Kiedy chcę zmienić ogranicznik, używam SQL w stylu:

SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table

Następnie potraktuj delimiter+ "^A " jako nowy delimiter.

 1
Author: moshaholo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 07:59:04

Podobnie jak odpowiedź Raya powyżej, Hive View 2.0 w Hortonworks Data Platform pozwala również uruchomić zapytanie Hive, a następnie zapisać wyjście jako csv.

 0
Author: schoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-03 13:35:43