bigdata—将单个键Map到多个值的SequenceFile

k97glaaz  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(306)

我正在尝试对数据进行一些预处理,这些数据将被提供给lucidworks大数据进行索引。lwbd接受sequencefile文件形式的solrxml。我想创建一个pig脚本,它将获取目录中的所有solrxml文件并以

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

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

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

,默认情况下,处理我将其馈送到的应用程序?或者我可以做一些后期处理来把它转换成这种格式?谢谢你的帮助。

zazmityj

zazmityj1#

因为我找不到任何关于内置sequencefile编写器的信息,所以我假设您正在使用udf(如果没有,那么您需要这样做)。
您必须提前对文件进行分组(按文件名),然后将其发送给writer 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 writer的方式,转换 all_xml_data 使用python自定义项提前打包到chararray,如:

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

注意:重要的是要认识到,这样xml数据的顺序将变得混乱。如果可能的话,根据你的数据, stringify 也许可以在重新设定的基础上进行扩展。

相关问题