Загрузка файла формата protobuf в скрипт pig с использованием loadfunc pig UDF

У меня очень мало знаний о свинье. У меня есть файл данных формата protobuf. Мне нужно загрузить этот файл в сценарий свиньи. Мне нужно написать LoadFunc UDF, чтобы загрузить его. скажем функция Protobufloader(),

мой сценарий PIG будет

A = LOAD 'abc_protobuf.dat' USING Protobufloader() as (name, phonenumber, email);

Все, что я хотел бы знать, как я могу получить поток ввода файла. Получив поток ввода файлов, я могу проанализировать данные из формата protobuf в формат кортежа PIG.

PS: заранее спасибо

1 ответ

Решение

У библиотеки с открытым исходным кодом Twitter есть много таких загрузчиков: https://github.com/kevinweil/elephant-bird

Вы можете использовать LzoProtobufB64LinePigLoader и LzoProtobufBlockPigLoader. https://github.com/kevinweil/elephant-bird/tree/master/src/java/com/twitter/elephantbird/pig/load

Чтобы использовать его, вам просто нужно сделать:

define ProtoLoader com.twitter.elephantbird.pig.load.LzoProtobufB64LineLoader('your.proto.class.name');
a = load '/your/file' using ProtoLoader;
b = foreach a generate
  field1, field2;

После загрузки он будет автоматически переведен в наборы свиней с правильной схемой.

Тем не менее, они предполагают, что вы записываете свои данные в сериализованный протобуфер и сжимаете с помощью lzo.

У них также есть соответствующие авторы, в пакете com.twitter.elephantbird.pig.store. Если ваш формат данных немного отличается, вы можете адаптировать их код к своему пользовательскому загрузчику.

Другие вопросы по тегам