动态模式的配置单元表创建

jvlzgdj9  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(394)

我们正在调查hive是否允许我们在mongo样式的动态模式上运行一些类似sql的查询,作为map reduce作业的前身。
数据以bson文件的几个tib的形式出现;每个文件都包含json“samples”。示例如下:

  1. {
  2. "_id" : "SomeGUID",
  3. "SomeScanner" :
  4. {
  5. "B64LR" : 22,
  6. "Version" : 192565886128245
  7. },
  8. "Parser" :
  9. {
  10. "Size" : 73728,
  11. "Headers" :
  12. [
  13. {
  14. "VAddr" : 4096,
  15. "VSize" : 7924.
  16. . . . etc. . . .

作为一个动态模式,只有少数字段是保证存在的。
我们希望能够对输入集运行查询,该输入集可能类似

  1. SomeScanner.Parser.Headers.VSize > 9000

在查找表Map之后,我不确定是否可以使用配置单元。如何Map一个列,可能在那里,也可能不在那里。更不用说在一个典型的示例中有大约2k-3k个可查询的值。
因此,我向Maven们提出以下问题:
hive能否根据遇到的数据构建动态模式?
如何构建一个包含~3k列的配置单元表?
有更好的办法吗?
谢谢,一如既往。

4bbkushb

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”到要使用的配置单元中。
因此,模式:

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

json数据可以通过以下命令行加载到表中:

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

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

  1. hive> select id, somescanner.parser.headers.vaddr from samplesjson;
  2. OK
  3. id vaddr
  4. 119 [4096,53248,57344]
展开查看全部

相关问题