2015-02-18 3 views
0

У меня есть файл данных, который не имеет идентификационного номера (индекса). Можно ли создать индекс каждой записи с использованием UDF или любой встроенной функции у свиней ?. Например:Есть ли способ создать индекс в Pig Script?

data = load 'myfile.txt' using PigStorge(',') AS (speed:float, location:charrarray); 
A = foreach data generate index as (Id:int), speed, location; 

Я имею данные проблемы загрузки от свиньи Hbase потому что HBase считывает скорость, как строки-ключ и есть много повторяющихся данных (скорость) в моем файле. Я хочу установить индекс как значение строки строки и сохранить в таблице Hbase. Есть ли у вас какие-либо предположения? Спасибо.

ответ

3

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

Вы можете написать UDF, который генерирует Java UUID, или вы можете использовать RANDOM, чтобы просто генерировать случайное число. Например:

data = load 'myfile.txt' using PigStorge(',') AS (speed:float, location:charrarray); 
A = foreach data generate RANDOM() as id, speed, location; 

Некоторые непрошеный совет: вы должны думать о том, почему вы используете HBase на секунду. Весь смысл использования хранилища ключей - это то, что вы можете искать вещи по клавишам. Если вы просто заклиниваете его в HBase с произвольным идентификатором, как вы собираетесь его искать? Если вы планируете полностью сканировать таблицы, вы, вероятно, должны просто использовать HDFS.

Какие вопросы вы хотите задать у своих данных? Если вы делаете по местоположению, вы можете сделать свое местоположение частью ключа и иметь событие в строке.

+3

Я уверяю вас, что вы просто используете его неправильно или не понимают, как работает модель данных. Он не является ни мусором, ни неполным. Вы должны узнать больше об этом, чтобы выяснить, что он может сделать для вас, но что вам нужно сделать, чтобы он работал правильно. Например, в 2010 году Facebook использовал HBase для хранения 135 миллиардов сообщений в месяц. Я уверен, что он сможет обрабатывать ваши данные датчика. http://highscalability.com/blog/2010/11/16/facebooks-new-real-time-messaging-system-hbase-to-store-135.html –

+0

Спасибо, Дональд. Я решил это. – Aarav

-1

Это был просто решить с помощью следующего питона UDF:

import random 
from datetime import datetime as dt 

def currTime(): 
    x =dt.now() 
    return x.microsecond+ int(random.random()*100)+x.second*1000000 

В каждых шагах он генерирует уникальный номер, и я использовал этот номер в качестве индекса. Тем не менее, есть шанс быть одним и тем же индексом в разных записях, но он слишком мал, что может быть меньше (0,01%) и зависит от времени обработки компьютера для каждого шага блока.

+0

Вы будете получать дубликаты идентификаторов, используя это. 'x.microsecond' имеет 1000 значений,' x.second' имеет 60 значений, а 'int (random.random() * 100)' имеет 100 значений = 6m комбинаций. По проблеме дня рождения у вас будет 99% -ный шанс дублировать идентификатор после генерации только 7434 идентификаторов. –

+0

Я уже решил свою проблему. Благодарю. – Aarav

2

Pig 0.14 версия поддерживает встроенную функцию UniqueID. Он вернет уникальную строку id для каждой записи в виде «taskindex-sequence».

A = foreach data generate UniqueID() as id, speed, location; 

http://pig.apache.org/docs/r0.14.0/func.html#uniqueid

+0

Я понятия не имел, что это было. Спасибо за обновление! –

Смежные вопросы