2011-10-12 4 views

Odpowiedz

11

Wymyśliłem to. Nie musiałem jednak pisać serde, napisałem niestandardowy InputFormat (rozszerza org.apache.hadoop.mapred.TextInputFormat), który zwraca niestandardowy RecordReader (implementuje org.apache.hadoop.mapred.RecordReader<K, V>). RecordReader implementuje logikę do odczytu i parsowania moich plików i zwraca wiersze rozdzielone tabulatorami.

Z tym oświadczyłem moim stole jak

create table t2 ( 
field1 string, 
.. 
fieldNN float)   
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'  
STORED AS INPUTFORMAT 'namespace.CustomFileInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 

ta wykorzystuje natywne SerDe. Ponadto wymagane jest określenie formatu wyjściowego w przypadku używania niestandardowego formatu wejściowego, dlatego wybieram jeden z wbudowanych formatów wyjściowych.

+0

Czy chcesz udostępnić kod, który posiadasz? Nowicjusz Java + Miaoop tutaj. Próbuję zdekompresować plik, który po dekompresji jest pojedynczą linią, ale czasami po kompresji zawiera znaki nowej linii. Hadoop dzieli go na nowe linie, więc dane zostają uszkodzone. Próbuję utworzyć wtyczkę dla ula. Wiem, że to stary wątek, ale muszę zapytać. Dzięki – Jeff

1

Jeśli używasz Hive, napisz serde. Zobacz te przykłady: https://github.com/apache/hive/tree/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2

Należy zauważyć, że ten interfejs jest specyficzny dla Hive. Jeśli chcesz użyć niestandardowego formatu pliku dla zwykłych zadań hadoop, musisz zaimplementować oddzielny interfejs (nie jestem całkowicie pewien, który z nich).

Jeśli już wiesz, jak deserializować dane w innym języku, możesz po prostu napisać zadanie strumieniowania (używając dowolnego języka) i użyć istniejących bibliotek.

Nadzieję, że pomaga

2

Zależy od tego, co otrzymujesz z pliku tekstowego.

Możesz napisać niestandardowy czytnik rekordów, aby przeanalizować plik dziennika tekstowego i przywrócić żądany sposób, klasa Input class wykonuje to zadanie za Ciebie. Słoik ten zostanie użyty do utworzenia tabeli Hive i załadowania danych do tej tabeli.

Mówiąc o SerDe, używam go trochę inaczej. Używam zarówno InputFormat, jak i SerDe, by analizować rzeczywiste dane, a drugie, aby uzyskać stabilizację moich metadanych, które reprezentują rzeczywiste dane. Dlaczego to robię? Chcę utworzyć odpowiednie kolumny (nie więcej lub mniej) w tabeli ula dla każdego wiersza mojego pliku dziennika, który mam i myślę, że SerDe jest dla mnie idealnym rozwiązaniem.

Ostatecznie zamawiam te dwa, aby utworzyć tabelę końcową, jeśli chcę lub zachowam te tabele tak, jak to możliwe, abym mógł wykonywać połączenia z zapytaniami z nich.

Podoba mi się wyjaśnienie bloga Cloudera.

http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

6

Zasadniczo trzeba zrozumieć tą różnicą, że gdy do modyfikacji SerDe, kiedy i modyfikować fileformat.

z oficjalnej dokumentacji: Hive SerDe

Co jest SerDe? 1.SerDe jest krótką nazwą dla "Serializer and Deserializer". 2.Hive używa SerDe (i FileFormat) do odczytywania i zapisywania wierszy tabeli. Pliki 3.HDFS -> InputFileFormat -> -> Deserializator -> Obiekt wiersza 4.Obiekt wiersza -> Serializer -> -> OutputFileFormat -> Pliki HDFS

Tak więc, 3 i 4 punkty wyraźnie wskazują różnicę. Musisz mieć niestandardowy format pliku (wejście/wyjście), jeśli chcesz odczytać rekord w inny sposób niż zwykle (gdzie rekordy są oddzielone przez '\ n'). Musisz też dostosować SerDe, jeśli chcesz zinterpretować zapisy odczytu w niestandardowy sposób.

Weźmy przykład powszechnie używanego formatu JSON.

Scenariusz 1: Załóżmy, że masz plik wejściowy json, w którym jedna linia zawiera jeden rekord json. Teraz potrzebujesz tylko Custom Serde, aby zinterpretować zapis odczytu w taki sposób, jaki chcesz. Nie ma potrzeby stosowania niestandardowego formatu inout, ponieważ 1 linia będzie miała 1 rekord.

Scenariusz 2: Teraz, jeśli masz plik wejściowy, gdzie jeden rekord json rozpięta na wielu liniach i chcesz ją przeczytać, ponieważ jest wtedy należy najpierw napisać niestandardowy format wejściowy czytać w 1 rekordzie json i to przeczytany rekord json przejdzie do Custom SerDe.