动态模式的Hive表创建

时间:2014-07-08 23:27:28

标签: mongodb hadoop hive bson hiveql

我们正在调查Hive是否允许我们运行一些类似SQL的查询 mongo风格的动态模式作为我们的map-reduce作业的前身。

数据以几个TiB的BSON文件的形式出现;每个文件都包含 JSON“样本”。示例样本如下:

{
    "_id" : "SomeGUID",
    "SomeScanner" : 
    {
        "B64LR" : 22,
        "Version" : 192565886128245
        },
        "Parser" : 
        {
            "Size" : 73728,
            "Headers" : 
            [
                {
                    "VAddr" : 4096,
                    "VSize" : 7924.                  
. . . etc. . . .

作为动态架构,只保证存在少数几个字段。

我们希望能够针对可能存在的输入集运行查询 喜欢

SomeScanner.Parser.Headers.VSize > 9000 

查看了表映射,我不确定这是否可以与Hive一起使用。 。 。如何映射可能存在或不存在的列。 。 。更不用说典型样本中有大约2k-3k可查询值。

因此,我向专家提问:

  • Hive可以根据遇到的数据构建动态架构吗?
  • 如何构建一个大约3k列的Hive表?
  • 有更好的方法吗?

一如既往地赞赏。

1 个答案:

答案 0 :(得分:2)

好的 - 太多了,我现在可以回答我自己的问题。

  • Hive可以根据遇到的数据构建动态模式吗? 答:没有。但是,存在一个很好的工具。 q.v.,inf。

  • 如何构建一个w / ~3K列的Hive表 答:Ibidem

  • 有更好的方法吗? 答:不是我发现的;但是,在一些帮助下,这并不困难。

首先,在http://thornydev.blogspot.com/2013/07/querying-json-records-via-hive.html向迈克尔·彼得森致敬,他的博客文章充当了这一点,并将其全部用完了。

如果您正在开始使用Hive,请务必查看。

现在,Hive无法原生导入JSON文档并从中推导出架构。 。 。然而,迈克尔彼得森开发的工具:https://github.com/midpeter444/hive-json-schema

一些警告: *不处理空数组和结构,因此删除(或填充)它们。否则,{ "something" : {} }{"somethingelse": []}之类的内容会抛出错误。

  • 如果任何字段的名称为" function",则必须在执行CREATE TABLE语句之前重新命名。例如,以下代码会抛出错误:1 {" someThing":{" thisIsOK":" true"," function":& #34; thatThrowsAnError" “

据推测,这是因为"function"是Hive关键字。

  • 而且,对于动态模式,即使模式有效,我也没有找到处理嵌套前导下划线名称的方法:{ "somethings": { "_someVal": "123", "otherVal": "456" } }将失败。

  • 对于常见的MongoDB" ID"字段,可以通过以下添加进行映射:with serdeproperties("mapping.id" = "_id"),它似乎与宏替换类似。

通过添加以下内容,https://github.com/rcongiu/Hive-JSON-Serde可以实现JSON的序列化/反序列化:ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'

N.B。,JsonSerDe JAR必须已添加到.hiverc或"将jar"添加到Hive中以供使用。
因此,架构:

CREATE TABLE samplesJSON 
    ( id string,
       . . . rest of huge schema . . . . )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH serdeproperties("mapping.id" = "_id");

可以使用以下命令将JSON数据加载到表中:

LOAD DATA LOCAL INPATH '/tmp/samples.json' OVERWRITE INTO TABLE samplesJSON;

最后,查询实际上是直观的直观。使用原始问题中的上述示例:

hive> select id, somescanner.parser.headers.vaddr from samplesjson;
OK
id    vaddr
119   [4096,53248,57344]