Chociaż można użyć INSERT OVERWRITE
do pobrania danych z Hive, może to nie być najlepsza metoda w Twoim konkretnym przypadku. Najpierw wyjaśnię, co to INSERT OVERWRITE
robi, a następnie opiszę metodę, której używam do pobierania plików tsv z tabel Hive.
Zgodnie z instrukcją , twoje zapytanie zapisze dane w katalogu w HDFS. Format nie będzie csv.
Dane zapisywane w systemie plików są serializowane jako tekst z kolumnami oddzielonymi ^ A i wierszami oddzielonymi znakami nowej linii. Jeśli którakolwiek z kolumn nie jest typu pierwotnego, te kolumny są serializowane do formatu JSON.
Niewielka modyfikacja (dodanie LOCAL
słowa kluczowego) spowoduje zapisanie danych w katalogu lokalnym.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
Kiedy uruchamiam podobne zapytanie, oto jak wygląda wynik.
[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 zapytanie bezpośrednio przez Hive w wierszu poleceń i przesyłam je do lokalnego pliku w następujący sposób:
hive -e 'select books from table' > /home/lvermeer/temp.tsv
To daje mi plik rozdzielany tabulatorami, którego mogę użyć. Mam nadzieję, że ci się to przyda.
W oparciu o tę poprawkę-3682 podejrzewam, że lepsze rozwiązanie jest dostępne podczas korzystania z Hive 0.11, ale nie jestem w stanie tego samodzielnie 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.
Jeśli chcesz plik CSV, możesz zmodyfikować rozwiązania Lukasa w następujący sposób (zakładając, że używasz Linuksa):
źródło
Należy użyć instrukcji CREATE TABLE AS SELECT (CTAS), aby utworzyć katalog w systemie plików HDFS z plikami zawierającymi wyniki zapytania. 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ć trochę sztuczki, aby przekonwertować pliki z „\ 001” - rozdzielone na CSV. Możesz użyć niestandardowego CSV SerDe lub przetworzyć wyodrębniony plik.
źródło
Możesz użyć
INSERT
……DIRECTORY
, jak w tym przykładzie:OVERWRITE
iLOCAL
mają takie same interpretacje jak poprzednio, a ścieżki są interpretowane zgodnie ze zwykłymi zasadami. W/tmp/ca_employees
zależności od liczby wywoływanych redukcji zostanie zapisany jeden lub więcej plików .źródło
Jeśli używasz HUE, jest to również dość proste. Po prostu przejdź do edytora Hive w HUE, wykonaj zapytanie gałęzi, a następnie zapisz plik wynikowy lokalnie jako XLS lub CSV albo możesz zapisać plik wynikowy w formacie HDFS.
źródło
Szukałem podobnego rozwiązania, ale te wymienione tutaj nie zadziałały. Moje dane zawierały wszystkie odmiany białych znaków (spacja, nowa linia, tabulacja), znaki i przecinki.
Aby zabezpieczyć dane tsv w kolumnie, zastąpiłem wszystkie znaki \ t w danych kolumny spacją i wykonałem kod Pythona w wierszu poleceń, aby wygenerować plik csv, jak pokazano poniżej:
Stworzyło to doskonale poprawny plik CSV. Mam nadzieję, że pomoże to tym, którzy szukają tego rozwiązania.
źródło
Możesz użyć funkcji ciągów gałęzi
CONCAT_WS( string delimiter, string str1, string str2...strn )
na przykład:
źródło
Jest to najbardziej przyjazny dla csv sposób, jaki znalazłem, aby wyświetlić wyniki HiveQL.
Nie potrzebujesz żadnych poleceń grep ani sed do formatowania danych, zamiast tego hive je obsługuje, wystarczy dodać dodatkowy znacznik formatu outputformat.
źródło
Miałem podobny problem i tak udało mi się go rozwiązać.
Krok 1 - Załaduj dane z tabeli Hive do innej tabeli w następujący sposób
Krok 2 - skopiowano obiekt blob z magazynu Hive do nowej lokalizacji z odpowiednim rozszerzeniem
źródło
lub
W przypadku tsv po prostu zmień csv na tsv w powyższych zapytaniach i uruchom zapytania
źródło
Domyślnym separatorem jest „
^A
”. W języku Python jest to „\x01
”.Kiedy chcę zmienić separator, używam SQL jak:
Następnie potraktuj separator + "
^A
" jako nowy separator.źródło
Wypróbowałem różne opcje, ale byłoby to jedno z najprostszych rozwiązań dla
Python
Pandas
:Możesz także użyć
tr "|" ","
do konwersji „|” do ","źródło
Podobnie jak w przypadku powyższej odpowiedzi Raya, Hive View 2.0 w Hortonworks Data Platform umożliwia również uruchomienie zapytania Hive, a następnie zapisanie wyniku w formacie csv.
źródło
Jeśli robisz to w systemie Windows, możesz użyć skryptu hivehoney w języku Python, aby wyodrębnić dane tabeli do lokalnego pliku CSV.
To będzie:
Wykonaj to w ten sposób:
źródło
Aby po uruchomieniu zapytania omówić więcej następujących kroków:
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;
W moim przypadku wygenerowane dane w folderze tymczasowym są w
deflate
formacie i wygląda to tak:Oto polecenie rozpakowania plików deflate i umieszczenia wszystkiego w jednym pliku csv:
źródło
Mogę się spóźnić na ten, ale pomogę w odpowiedzi:
echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv gałąź -e 'wybierz odrębne konkatowanie (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) z table_Name, gdzie klauzula, jeśli jest wymagana;' >> SAMPLE_Data.csv
źródło
To polecenie powłoki drukuje format wyjściowy w csv
output.txt
bez nagłówków kolumn.źródło
Użyj polecenia:
hive -e "use [nazwa_bazy_danych]; wybierz * z [nazwa_tabeli] LIMIT 10;" > /ścieżka/do/plik/nazwa_moje_pliku.csv
Miałem ogromny zbiór danych, którego szczegóły starałem się uporządkować i określić rodzaje ataków oraz ich liczbę. Przykład, którego użyłem w mojej praktyce, który zadziałał (i miał trochę więcej szczegółów), wygląda mniej więcej tak:
źródło