我还没有找到任何方法将整个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步骤是这样的。
感谢您的帮助和建议。坚持了很长时间(((
暂无答案!
目前还没有任何答案,快来回答吧!