【问题标题】:Getting empty values, while parsing XML using Pig获取空值,同时使用 Pig 解析 XML
【发布时间】:2015-12-03 18:21:16
【问题描述】:

我有一个如下所示的 XML 文件。我正在使用XMLLOader 加载 XML。它工作正常。但是,在获取值时,它会给出空值:

<mfh>
    <f></f>
    <sn>***</sn>
    <st>****</st>
    <vnr>****</vnr>
    <cb>***</cb>
</mfh>
<md>
    <nei>
        <ne>***</ne>
        <k>***</k>
        <n>***</n>
    </nei>
    <mi>
        <mts>**</mts>
        <g>**</g>
        <mv>
            <m>***</m>
        </mv>
    </mi>
   .....
   .....
</md>

我的猪脚本如下:

REGISTER '/usr/lib/pig/piggybank.jar'
a = load '/user/root/sample.xml' using org.apache.pig.piggybank.storage.XMLLoader('mfh') as (doc:chararray);
dump input_xml;
b = foreach input_xml generate FLATTEN(REGEX_EXTRACT_ALL(doc,'<mfh>\\s*<ffv>(.*)</ffv>\\s*</mfh'));
dump required_tags;

脚本的输出如下:

它没有给出任何错误,但输出是 ()。我已经更新了 XML 文件,我想解析所有的值。

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    你可以试试这个吗?

    按照您的示例打印“ffv”属性的值:

     required_tags = foreach input_xml generate FLATTEN(REGEX_EXTRACT_ALL(doc,'<mfh>\\s+<ffv>(.*)</ffv>.*'));
    

    打印ffv,sn,st,vn,cbt的所有值:

       required_tags = foreach input_xml generate FLATTEN(REGEX_EXTRACT_ALL(doc,'<mfh>\\s+<ffv>(.*)</ffv>\\s+<sn>(.*)</sn>\\s+<st>(.*)</st>\\s+<vn>(.*)</vn>\\s+<cbt>(.*)</cbt>\\s+</mfh>'));
    

    【讨论】:

    • 第二个正在打印所有值,但第一个无法获取单个值
    • 对我来说它工作正常。可以粘贴 input_xml 的转储吗?
    • 上述 xml 不是完整的 xml 文件,它有很多其他标签。当我将上述内容复制到单独的 xml 中时,我可以使用您的第二个解决方案获取值。但是当我我试图从完整的 xml 中获取它不起作用。
    • 一般不推荐使用Regex解析xml文件。一种解决方法是您可以使用任何在线转换器将您的 xml 文件转换为 json,并使用大象加载器加载 json 文件。这将为检索键/值对中的所有字段提供很大的灵活性。我并不是说这是最好的解决方案,但与为 xml 编写复杂的正则表达式相比,这会好得多。
    【解决方案2】:

    你可以这样做

    required_tags = foreach input_xml 生成 FLATTEN(REGEX_EXTRACT_ALL(doc,'\s*(.)\s(.)\s(.)\s (.)\s(.*)')) AS (ffv,sn,st,vn,cbt); 转储 required_tags;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多