0

我正在尝试对将馈送到 LucidWorks 大数据进行索引的数据进行一些预处理。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>"

,由我提供给它的应用程序的默认处理?或者我可以做一些后处理来把它变成这种格式吗?谢谢您的帮助。

4

1 回答 1

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使用 Python UDF 提前将包转换为 chararray 可能更容易,例如:

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

注意:重要的是要意识到这种方式 xml 数据的顺序会变得混乱。如果可能的话,可以根据您的数据stringify进行扩展,对其进行重组。

于 2013-09-09T21:19:01.743 回答