我们正在调查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可查询值。
因此,我向专家提问:
一如既往地赞赏。
答案 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"
是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]