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

标签 java json hadoop elephantbird

我需要提取大型 JSON 文件,其记录可能跨越多行(而不是文件)(完全取决于数据提供者的编写方式)。

Elephant-Bird 采用 LZO 压缩,我知道数据提供者不会这样做。

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

任何想法,除了压缩 JSON 之外......文件都将是巨大的......关于如何正确拆分文件以使 JSON 不被破坏。

编辑:行,而不是文件

最佳答案

没有任何其他建议,并且取决于 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!"
      }
    ]
}

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

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

关于java - JSON 对象跨越多行,如何在 Hadoop 中拆分输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11938792/

相关文章:

java - 如何检查无效输入并循环直到输入有效?

java - Eclipse SWT java.lang.StackOverflowError : why my listener executes many times?

java - GWT Browser在Client中的区别

java - 如何根据用户输入创建表?

javascript - 解码 JSONObject 内的 JSON 对象和 JSON 数组

json - extjs存储错误处理

.net - JSON.NET JsonConvert 与 .NET JavaScriptSerializer

java - Flume HDFS接收器自定义文件名

hadoop - yarn : Do we need nodemanager on namenode?

hadoop - 在Hive转换中传递表头