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!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.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
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.
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.
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.
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
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.
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"
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.
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.
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