如何查询以 xml 作为一列的 hdfs 中的文件

How to query file in hdfs which has xml as one column

上下文: 我在 mysql 中的 table 中有数据,其中 xml 作为一列。 例如:Table 应用程序有 3 个字段。 id(integer) , details(xml) , address(text) (在实际情况下,我这里有 10-12 个字段)。 现在我们想使用 pig.

查询整个 table 中的所有字段 mysql table

使用带有

的 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 加载程序。

例如:

A =  LOAD 'xmls/hadoop_books.xml' using org.apache.pig.piggybank.storage.XMLLoader('BOOK') as (x:chararray);
  1. 使用 pig 查询此类数据是否好用,请建议是否有任何其他替代技术可以有效地做到这一点。

目前的数据大小约为 500 GB。

仅供参考,我是 hadoop 生态系统的新手,我可能遗漏了一些微不足道的东西。

加载特定列:

  • 其他一些 Whosebug 答案建议使用 awk 预处理数据(生成一个新输入仅包含 xml 部分。)
  • 一种更好的解决方法,可以通过 xml 列中的额外 FOREACH 生成特定数据,例如:

    B = FOREACH 应用生成详细信息;

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

或者使用 UDF 进行 XML 处理,在 pig 中你只需交出相关的 xml 字段。