将单个键映射到多个值的Sequencefile

时间:2013-08-09 02:13:33

标签: bigdata apache-pig sequencefile lucidworks

我正在尝试对将被提供给LucidWorks Big Data进行索引的数据进行一些预处理。 LWBD以Sequencefile文件的形式接受SolrXML。我想创建一个Pig脚本,它将把所有SolrXML文件放在一个目录中并以格式输出它们

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

Pig的本地PigStorage()加载函数可以自动创建一个列,其中包含从中提取数据的文件的名称,理想情况下如下所示:

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

但是,PigStorage()也会自动使用'\ n'作为行分隔符,所以我最终得到的是一个看起来像这样的包:

{"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>"

,通过我将其提供给应用程序的默认处理?或者是否有一些后处理可以让它进入这种格式?谢谢你的帮助。

1 个答案:

答案 0 :(得分: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编写器的方式,使用Python UDF将all_xml_data包提前转换为chararray可能更容易:

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

注意:重要的是要意识到这种方式xml数据的顺序将变得混乱。如果可能,根据您的数据,stringify可以在重新整理时展开。