我正在尝试对将被提供给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>"
,通过我将其提供给应用程序的默认处理?或者是否有一些后处理可以让它进入这种格式?谢谢你的帮助。
答案 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
可以在重新整理时展开。