将单个键映射到多个值的序列文件

Posted

技术标签:

【中文标题】将单个键映射到多个值的序列文件【英文标题】:Sequencefiles which map a single key to multiple values 【发布时间】:2013-08-09 02:13:33 【问题描述】:

我正在尝试对将馈送到 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>"

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

【问题讨论】:

你是如何创建序列文件的?前任。您使用的是什么 Pig Latin/UDF? 【参考方案1】:

由于我找不到任何关于内置 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 可以在重组时扩展。

【讨论】:

以上是关于将单个键映射到多个值的序列文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Clojure 的嵌套映射中关联多个键/值的惯用方法是啥?

使用番石榴缓存(内存表)维护多个索引

映射两个数据框以创建一个包含多个键值的字典 - Pandas

将多个键上的 pandas 数据帧映射为列或 multiIndex

将多个表映射到单个实体

具有单个键的多个值的STL集合