将单个键映射到多个值的序列文件
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