如何在pig中解析xml字符串(而不是文件)(无负载)

ego6inou  于 2021-05-29  发布在  Hadoop
关注(0)|答案(0)|浏览(223)

我还没有找到任何方法将整个xml文档中的字符串解析为单独的元组,请建议我怎么做?
假设我们有avro文件:

{fieldname: id, fieldname: xml}

xml结构:

<?xml version='1.0' encoding='UTF-8'?>
<response>
    <name>Ghty</name>
    <main>
        <data>
            <id>1</id>
            <text>ABC mask</text>
            <title>Some text</title>
        </data>
        <data>
            <id>2</id>
            <text>Second value</text>
            <title>To</title>
        </data>
        <data>
            <id>3</id>
            <text>Evolving to</text>
            <title>Hint 567</title>
        </data>
    </main>
</response>

当我们从xml文件加载时,很明显,根据我们放入语句中的标记,输入xml会分成几个部分:

DEFINE XMLLoader org.apache.pig.piggybank.storage.XMLLoader('data');
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
xml = LOAD '$XPATH' using XMLLoader as (x:chararray);
DUMP xml;

(<data><id>1</id><text>ABC mask</text><title>Some text</title></data>)
(<data><id>2</id><text>Second value</text><title>To</title></data>)
(<data><id>3</id><text>Evolving to</text><title>Hint 567</title></data>)

xml_parse = FOREACH xml GENERATE
    XPath(x, 'data/id') as (id:chararray), 
    XPath(x, 'data/text') as (text:chararray), 
    XPath(x, 'data/title') as (title:chararray);

DUMP xml_parse;

(1,ABC mask,Some text)
(2,Second value,To)
(3,Evolving to,Hint 567)

我想对字符串中的xml执行相同的操作,而不执行加载操作。但是,如果我们在字符串中有这样的xml,并且它们没有被拆分以进行进一步的xpath操作,那么我们怎么做呢?

(<?xml version='1.0' encoding='UTF-8'?><response><name>Ghty</name><main><data><id>1</id><text>ABC mask</text><title>Some text</title></data><data><id>2</id><text>Second value</text><title>To</title></data><data><id>3</id><text>Evolving to</text><title>Hint 567</title></data></main></response>)

1我尝试应用这种方法,但没有成功,因为我只从xml字符串中获取第一个元素:

xml = LOAD 'xml_set.avro' using  
org.apache.pig.piggybank.storage.avro.AvroStorage();

xml_parse = foreach xml generate
    XPath($0, 'data');

DUMP xml_parse ;

(1,ABC mask,Some text)

2我尝试使用xpathall,但也没有成功,所有值都放在一个元组中:
xml=使用加载“xml\u set.avro”
org.apache.pig.piggybank.storage.avro.avrostorage();

xml_parse = foreach xml generate
    XPathAll($0, 'data'),
    XPathAll($0, 'data'),
    XPathAll($0, 'data'),
DUMP xml_parse ;

((1,ABC mask,Some text,2,Second value,To,3,Evolving to,Hint 567))

三。然后我尝试将xpathall用于完整的标记路径,但结果是一个元组。我需要把它们按正确的顺序分开,但不知道怎么做。

xml = LOAD 'xml_set.avro' using  
org.apache.pig.piggybank.storage.avro.AvroStorage();

xml_parse = foreach xml generate
    XPathAll($0, 'data/id'),
    XPathAll($0, 'data/text'),
    XPathAll($0, 'data/title'),
DUMP xml_parse ;

((1,2,3),(ABC mask,Second value, Evolving to),(Some text,To,Hint 567))

似乎需要一些支点来完成。目标是:

(1,ABC mask,Some text)
(2,Second value,To)
(3,Evolving to,Hint 567)

ofc我可以将avro中的所有xml存储到一个大的xml文件中,然后用xmloader加载它,但我假设它的redundunt步骤是这样的。
感谢您的帮助和建议。坚持了很长时间(((

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题