我们正在调查hive是否允许我们在mongo样式的动态模式上运行一些类似sql的查询,作为map reduce作业的前身。
数据以bson文件的几个tib的形式出现;每个文件都包含json“samples”。示例如下:
{
"_id" : "SomeGUID",
"SomeScanner" :
{
"B64LR" : 22,
"Version" : 192565886128245
},
"Parser" :
{
"Size" : 73728,
"Headers" :
[
{
"VAddr" : 4096,
"VSize" : 7924.
. . . etc. . . .
作为一个动态模式,只有少数字段是保证存在的。
我们希望能够对输入集运行查询,该输入集可能类似
SomeScanner.Parser.Headers.VSize > 9000
在查找表Map之后,我不确定是否可以使用配置单元。如何Map一个列,可能在那里,也可能不在那里。更不用说在一个典型的示例中有大约2k-3k个可查询的值。
因此,我向Maven们提出以下问题:
hive能否根据遇到的数据构建动态模式?
如何构建一个包含~3k列的配置单元表?
有更好的办法吗?
谢谢,一如既往。
1条答案
按热度按时间4bbkushb1#
好了--我现在可以回答我自己的问题了。
hive能否根据遇到的数据构建动态模式?答:没有。不过,有一个很好的工具。q、 五、inf。
如何构建一个包含~3k列的配置单元表a:ibidem
有更好的办法吗?a:不是我发现的;但是,有了一些帮助,这并不太难。
首先,向迈克尔·彼得森大声喊叫http://thornydev.blogspot.com/2013/07/querying-json-records-via-hive.html,他的博客文章是解决这一切的关键。
如果你是从Hive开始的话,一定要去看看。
现在,hive无法本机导入json文档并从中推断模式。但是,michael peterson开发了一种工具,可以:https://github.com/midpeter444/hive-json-schema
一些注意事项:*空数组和结构不被处理,所以删除(或填充)它们。否则
{ "something" : {} }
或者{"somethingelse": []}
将抛出错误。如果任何字段的名称为“function”,则必须在执行create table语句之前对其重新命名。e、 例如,下面的代码将抛出一个错误:1{“something”:{“thisisok”:“true”,“function”:“thatthrowsanerror”}
大概是因为
"function"是配置单元关键字。 而且,对于一般的动态模式,即使模式有效,我也没有找到处理嵌套的前导下划线名称的方法:
{ "somethings": { "_someVal": "123", "otherVal": "456" } }会失败的。 对于公共mongodb“id”字段,可以通过以下添加进行Map:
with serdeproperties("mapping.id" = "_id"),这似乎类似于宏替换。 json的序列化/反序列化可以通过https://github.com/rcongiu/hive-json-serde 通过添加以下内容:
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'` n、 b.,jsonserde jar必须已添加到.hiverc或“add jar”到要使用的配置单元中。因此,模式:
json数据可以通过以下命令行加载到表中:
最后,查询实际上是直观的。使用原问题中的上述示例: