JSON对象跨越多行,如何在Hadoop中拆分输入

Maz*_*Maz 7 java json hadoop elephantbird

我需要摄取大型JSON文件,其记录可能跨越多行(而不是文件)(完全取决于数据提供者如何编写它).

Elephant-Bird假设LZO压缩,我知道数据提供者不会这样做.

Dzone文章http://java.dzone.com/articles/hadoop-practice假设JSON记录将在同一行.

任何想法,除了压缩JSON ...文件将是巨大的...如何正确分割文件,使JSON不会破坏.

编辑:行,而不是文件

Chr*_*ite 2

如果没有任何其他建议,并且取决于 JSON 的格式化方式,您可能有一个选择。

正如 Dzone 文章中指出的,问题在于 JSON 没有结束元素,当您跳转到分割点时可以轻松找到该结束元素。

现在,如果您的输入 JSON 具有“漂亮”或标准格式,您可以在自定义输入格式实现中利用这一点。

例如,从 Dzone 示例中获取示例 JSON:

{
  "results" :
    [
      {
        "created_at" : "Thu, 29 Dec 2011 21:46:01 +0000",
        "from_user" : "grep_alex",
        "text" : "RT @kevinweil: After a lot of hard work by ..."
      },
      {
        "created_at" : "Mon, 26 Dec 2011 21:18:37 +0000",
        "from_user" : "grep_alex",
        "text" : "@miguno pull request has been merged, thanks again!"
      }
    ]
}
Run Code Online (Sandbox Code Playgroud)

使用这种格式,您知道(希望?)每个新记录都从具有 6 个空格和一个开括号的行开始。记录以类似的格式结束 - 6 个空格和一个右括号。

因此,在这种情况下,您的逻辑是:消耗行,直到找到包含 6 个空格和一个左括号的行。然后缓冲内容,直到找到 6 个空格和一个右括号。然后使用任何您想要将其转换为 java 对象的 JSON 反序列化器(或者只是将多行文本传递给您的映射器。