如何查询hdfs中的文件,其中xml为一列

时间:2015-08-31 06:50:11

标签: hadoop hive apache-pig

上下文:   我在mysql中的表中有数据,xml作为一列。 对于Ex:Table应用程序有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);

查询此类数据的最佳方式是什么。

我目前可以考虑的解决方案。

  1. 使用自定义加载程序并扩展Loadfunc以读取数据。
  2. 如果有某种方法可以使用xmlpathloader加载特定列并正常加载。请建议是否可以这样做。 正如我在xpath中看到的所有示例都在加载文件时使用XML加载器。
  3. 对于Ex:

    A =  LOAD 'xmls/hadoop_books.xml' using org.apache.pig.piggybank.storage.XMLLoader('BOOK') as (x:chararray);
    
    1. 使用pig查询此类数据是否合适,请建议是否有其他替代技术可以有效地进行。
    2. 存在的数据大小约为500 GB。

      仅供参考我是hadoop ecosytem的新手,我可能会遗漏一些微不足道的东西。

1 个答案:

答案 0 :(得分:1)

加载特定列:

  • 其他一些StackOverflow答案建议使用awk预处理数据(生成一个新输入只包含xml部分。)
  • 使用xml列中的额外FOREACH生成特定数据的更好的工作方式,如:

    B = FOREACH app GENERATE details;

并存储它以便能够使用XML加载器加载。 检查StreamingXMLLoader (你也可以检查Apache Drill它可以支持这种情况开箱即用)

或者使用UDF进行XML处理,并且只需移交相关的xml字段。