context:我在mysql的一个表中有数据,其中xml是一列。例如:表应用程序有3个字段。 id(integer) , details(xml) , address(text)
(在实际情况中,这里有10-12个字段)。现在我们要使用pig查询mysql表中所有字段的整个表。
使用sqoop将数据从mysql传输到hdfs
record delimiter '\u0005' and column delimiter as "`" to /x.xml.
然后使用将x.xml中的数据加载到pig中
app = LOAD '/x.xml' USING PigStorage('\u0005') AS (id:int , details:chararray , address:chararray);
查询此类数据的最佳方式是什么。
我现在可以考虑的解决方案。
使用自定义加载程序和扩展loadfunc读取数据。
如果有某种方法可以正常使用xmlpathloader和rest加载来加载特定的列。请建议是否可以这样做。正如我看到的所有使用xpath的示例一样,在加载文件时都使用xml加载器。
例如:
A = LOAD 'xmls/hadoop_books.xml' using org.apache.pig.piggybank.storage.XMLLoader('BOOK') as (x:chararray);
使用pig来查询此类数据是否合适,如果有其他替代技术,请建议是否有效。
显示的数据大小约为500GB。
仅供参考,我是hadoop Ecosystem的新手,可能遗漏了一些琐碎的东西。
1条答案
按热度按时间jdgnovmf1#
加载特定列:
其他一些stackoverflow答案建议使用awk对数据进行预处理(生成一个只包含xml部分的新输入)
从xml列中使用额外的foreach来生成特定数据是一种更好的方法,如:
b=foreach应用程序生成详细信息;
并将其存储为能够使用xml加载程序加载。检查streamingxmloader(您还可以检查apachedrill,它可能支持这种开箱即用的情况)
或者使用udf进行xml处理,在pig中,您只需交出相关的xml字段。