2013-08-09 6 views
0

Я пытаюсь выполнить некоторую предварительную обработку данных, которые будут переданы в LucidWorks Big Data для индексирования. LWBD принимает SolrXML в виде файлов Sequencefile. Я хочу, чтобы создать скрипт Свиньи, который будет принимать все файлы SolrXML в каталоге и выводить их в формате нативную функцию PigStorage() нагрузкиSequencefiles, которые отображают один ключ для нескольких значений.

filename_1 => <here goes some XML> 
... 
filename_N => <here goes some more XML> 

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

{"filename_1", "<here goes some XML>"} 
... 
{"filename_N", "<here goes some more XML>"} 

Однако PigStorage() также автоматически использует «\ п» в качестве строки разделителей, так что я на самом деле в конечном итоге представляет собой мешок, который выглядит следующим образом:

{"filename_1", "<some partial XML from file 1>"} 
{"filename_1", "<some more partial XML from file 1>"} 
{"filename_1", "<the end of file 1>"} 
... 

Уверен, что вы получили картину. Мой вопрос в том, должен ли я записать этот пакет в SequenceFile, как он будет читаться другими приложениями? Может ли он быть объединен как

"filename_1" => "<some partial XML from file 1> 
       <some more partial XML from file 1> 
       <the end of file 1>" 

, по умолчанию обработка приложения я его кормлю? Или есть какая-то постобработка, которую я могу сделать, чтобы получить ее в этом формате? Спасибо за помощь.

+0

Как вы создаете SequenceFile? E.X. Какую Pig Latin/UDF вы используете? – mr2ert

ответ

0

Поскольку я ничего не могу найти о встроенном скрипте SequenceFile, я предполагаю, что вы используете UDF (а если нет, то вам нужно).

Вам придется группировать файлы (по имени файла) заблаговременно, а затем отправлять их автору UDF.

DESCRIBE xml ; 
-- xml: {filename: chararray, xml_data: chararray} 

B = FOREACH (GROUP xml BY filename) 
    GENERATE group AS filename, xml.xml_data AS all_xml_data ; 

В зависимости от того, как вы написали SequenceFile писатель, это может быть проще преобразовать all_xml_data мешок загодя к chararray с использованием Python UDF, как:

@outputSchema('xml_complete: chararray') 
def stringify(bag): 
    delim = '' 
    return delim.join(bag) 

ПРИМЕЧАНИЕ: Это важно понять, что таким образом порядок данных xml станет беспорядочным. Если возможно, исходя из ваших данных, stringify может быть расшифрован после его повторной передачи.