2012-12-04 15 views
9

Mam wiele problemów z uzyskiwaniem danych ze świni i do pliku CSV, którego mogę używać w Excelu lub SQL (lub R lub SPSS itp. Itd.) Bez dużej manipulacji ...Eksport ze świni do pliku CSV

próbowałem za pomocą następujących funkcji:

STORE pig_object INTO '/Users/Name/Folder/pig_object.csv' 
    USING CSVExcelStorage(',','NO_MULTILINE','WINDOWS'); 

tworzy folder o tej nazwie z dużą ilością części m-0000 # plików. Mogę później połączyć je wszystkie za pomocą cat part *> filename.csv, ale nie ma nagłówka, co oznacza, że ​​muszę go ręcznie wstawić.

Przeczytałem, że PigStorageSchema ma utworzyć inny bit z nagłówkiem, ale nie działa w ogóle, np. Otrzymuję taki sam wynik, jak gdyby został właśnie zapisany, bez pliku nagłówkowego: STORE pig_object INTO '/ Users/Name/Folder/pig_object' USING org.apache.pig.piggybank.storage.PigStorageSchema();

(Próbowałem to zarówno w trybie lokalnym i mapreduce).

Czy jest jakiś sposób na uzyskanie danych Spośród Świni w prosty plik CSV bez tych kilku krokach?

Każda pomoc będzie bardzo ceniona!

Odpowiedz

28

Obawiam się, że nie jest to jedna wkładka, która spełnia swoje zadanie, ale można wymyślić następne (Pig v0.10.0):

A = load '/user/hadoop/csvinput/somedata.txt' using PigStorage(',') 
     as (firstname:chararray, lastname:chararray, age:int, location:chararray); 
store A into '/user/hadoop/csvoutput' using PigStorage('\t','-schema'); 

Kiedy PigStorage trwa „-schema” go utworzy ".pig_schema" i ".pig_header" w katalogu wyjściowym. Następnie trzeba scalić „.pig_header” z „part-x-xxxxx”:

1. Jeśli wynik muszą być skopiowane na dysk lokalny:

hadoop fs -rm /user/hadoop/csvoutput/.pig_schema 
hadoop fs -getmerge /user/hadoop/csvoutput ./output.csv 

(Od -getmerge bierze katalog wejściowy trzeba dostać pozbyć .pig_schema pierwszego)

2. przechowywania wynik na HDFS:

hadoop fs -cat /user/hadoop/csvoutput/.pig_header 
    /user/hadoop/csvoutput/part-x-xxxxx | 
    hadoop fs -put - /user/hadoop/csvoutput/result/output.csv 

Dla dalszego odniesienia może również rzucić okiem na te stanowiska:
STORE output to a single CSV?
How can I concatenate two files in hadoop into one using Hadoop FS shell?

+0

Dzięki bardzo za pomoc, Lorand. Wywoływanie poleceń powłoki oczyszcza trochę. Jednak argument -schema nie tworzy plików .pig_header lub .pig_schema, gdy go uruchomię. Próbowałem używać PigStorage i PigStorageSchema. Używam Pig 0.10.0. – Saxivore

+0

Cześć kolego, dalej ... plik .pig_header _is_ został utworzony, ale został ukryty i nie mogłem go zobaczyć (wciąż przyzwyczajam się do pracy z powłokami). Tak, mam obejście, które można zrobić w skrypcie, który jest niesamowity. Dzięki! – Saxivore

+0

@Saxivore Sprawdź schemat 'pig_object. Jeśli go nie ma, nie będzie można utworzyć plików nagłówków i schematów. Czy potrzebujesz więcej pomocy w związku z tym pytaniem? –

1

jeśli będzie przechowywać dane jako PigStorage na HDFS a następnie połączyć go za pomocą -getmerge -nl:

STORE pig_object INTO '/user/hadoop/csvoutput/pig_object' 
    using PigStorage('\t','-schema'); 
fs -getmerge -nl /user/hadoop/csvoutput/pig_object /Users/Name/Folder/pig_object.csv; 

Docs:

Opcjonalnie -nl można ustawić, aby umożliwić dodanie znaku nowego wiersza (LF) pod numerem na końcu każdego pliku.

trzeba będzie pojedynczy TSV/CSV o następującej strukturze:

1 - header 
2 - empty line 
3 - pig schema 
4 - empty line 
5 - 1st line of DATA 
6 - 2nd line of DATA 
... 

więc możemy po prostu usunąć linie [2,3,4] za pomocą AWK:

awk 'NR==1 || NR>4 {print}' /Users/Name/Folder/pig_object.csv > /Users/Name/Folder/pig_object_clean.csv