【问题标题】:Bit-level querying in Hadoop and HiveHadoop 和 Hive 中的位级查询
【发布时间】:2017-06-16 17:08:46
【问题描述】:

我们有一个在 Hadoop 中进行位级查询的用例。它是这样的:

给定一组包含日期/时间戳和一个或多个 16 位数据字的可变长度记录,返回一个日期/时间戳列表,其中一个或多个任意数据字的任意位组合设置为查询中指定的值。

示例...给定以下数据:

Timestamp             Word 1 bits                Word 2 bits
------------------    ----------------------     ---------------------          
2017-06-16 08:15:05   0010  1101  1111  0000     1011  0010  1111  0010
2017-06-16 08:15:06   0010  1110  1111  0000     ...
2017-06-16 08:15:07   0010  1101  1111  0000     ...
2017-06-16 08:15:08   0010  1110  1111  0000
2017-06-16 08:15:09   0010  1101  1111  0000
2017-06-16 08:15:10   0010  1110  1111  0000

如果查询是“返回第 1 位第 0 位为 0 且第 1 位第 1 位为 1 的所有时间戳”,则结果为

Timestamp             Word 1 bits
------------------    ----------------------
2017-06-16 08:15:06   0010  1110  1111  0000
2017-06-16 08:15:08   0010  1110  1111  0000
2017-06-16 08:15:10   0010  1110  1111  0000
                              ^^

数据以制表符分隔的形式作为十六进制值提供:

Timestamp             Word1  Word2  Word3  Word4  
------------------    ----   ----   ----   ----
2017-06-16 08:15:05   2DF0  ... a varying number of 16 bit data words continues out here.
2017-06-16 08:15:06   2EF0
2017-06-16 08:15:07   2DF0
2017-06-16 08:15:08   2EF0
2017-06-16 08:15:09   2DF0
2017-06-16 08:15:10   2EF0
...

我们一直在研究如何在 Hadoop 配置单元中表示这些数据并对其进行查询。将每个数据字的每一位放入其自己的整数字段中似乎效率极低,但具有可直接由 Hadoop 查询的优点,假设 Hadoop 服务器可以容纳每条记录中可变数量的列。

为了解决这个问题,我提出了我们将这些数据作为一等时间戳和 16 位无符号整数导入 hive 的建议,然后使用位提取 Java 函数为每个查询构造一个 MapReduce 作业来构造一个具有时间戳字段的临时表和每个感兴趣的bit 在其自己的一等整数中。容我们说,从临时获取最终结果所需的 Hadoop 查询将是微不足道的。

但是,目前提出的想法是将十六进制文本直接保存到数据湖中。 我们的数据科学家似乎认为这样的安排将允许直接查询;也就是说,不需要临时表,并且十六进制格式提供了相当有效的存储。

这可能如何工作?是否有某种方法可以索引此类文本,然后对其进行某种位级文本搜索,屏蔽掉不感兴趣的位?

(我会就如何以更好的方式解决这个问题提出建议。)

【问题讨论】:

  • “你为什么不问问你的数据科学家?”这是个好问题。说来话长;简短的回答是我没有现成的数据科学家,而且我不是 Hadoop 专家。

标签: java hadoop hive mapreduce bit


【解决方案1】:

演示

data.tsv

2017-06-16 08:15:05 2DF0
2017-06-16 08:15:06 2EF0    0000
2017-06-16 08:15:07 2DF0    AAAA    BBBB    CCCC
2017-06-16 08:15:08 2EF0    1111    2222
2017-06-16 08:15:09 2DF0    
2017-06-16 08:15:10 2EF0    DDDD    EEEE

create external table mytable
(
    ts          timestamp
   ,words       string
)
row format delimited
fields terminated by '\t'
stored as textfile
tblproperties ('serialization.last.column.takes.rest'='true')
;

select  *
       
from    mytable
;

+----------------------------+---------------------------+
|             ts             |            words          |
+----------------------------+---------------------------+
| 2017-06-16 08:15:05.000000 | 2DF0                      |
| 2017-06-16 08:15:06.000000 | 2EF0 0000                 |
| 2017-06-16 08:15:07.000000 | 2DF0 AAAA    BBBB    CCCC |
| 2017-06-16 08:15:08.000000 | 2EF0 1111    2222         |
| 2017-06-16 08:15:09.000000 | 2DF0                      |
| 2017-06-16 08:15:10.000000 | 2EF0 DDDD    EEEE         |
+----------------------------+---------------------------+

select  ts
       ,split(words,'\\t')  as words
       
from    mytable
;

+----------------------------+-------------------------------+
|             ts             |             words             |
+----------------------------+-------------------------------+
| 2017-06-16 08:15:05.000000 | ["2DF0"]                      |
| 2017-06-16 08:15:06.000000 | ["2EF0","0000"]               |
| 2017-06-16 08:15:07.000000 | ["2DF0","AAAA","BBBB","CCCC"] |
| 2017-06-16 08:15:08.000000 | ["2EF0","1111","2222"]        |
| 2017-06-16 08:15:09.000000 | ["2DF0",""]                   |
| 2017-06-16 08:15:10.000000 | ["2EF0","DDDD","EEEE"]        |
+----------------------------+-------------------------------+

select  ts
       ,lpad(conv(split(words,'\\t')[0],16,2),16,'0')  as word1_bits
       
from    mytable
;

+----------------------------+------------------+
|             ts             |    word1_bits    |
+----------------------------+------------------+
| 2017-06-16 08:15:05.000000 | 0010110111110000 |
| 2017-06-16 08:15:06.000000 | 0010111011110000 |
| 2017-06-16 08:15:07.000000 | 0010110111110000 |
| 2017-06-16 08:15:08.000000 | 0010111011110000 |
| 2017-06-16 08:15:09.000000 | 0010110111110000 |
| 2017-06-16 08:15:10.000000 | 0010111011110000 |
+----------------------------+------------------+

select  ts
       
from    mytable

where   substr(lpad(conv(split(words,'\\t')[0],16,2),16,'0'),7,2) = '10'
;

+----------------------------+
|             ts             |
+----------------------------+
| 2017-06-16 08:15:06.000000 |
| 2017-06-16 08:15:08.000000 |
| 2017-06-16 08:15:10.000000 |
+----------------------------+

替代数据结构

create external table mytable
(
    ts          timestamp
   ,word1       string
   ,word2       string
   ,word3       string
   ,word4       string
   ,word5       string
   ,word6       string
   ,word7       string
   ,word8       string
   ,word9       string
)
row format delimited
fields terminated by '\t'
stored as textfile
;

select * from mytable
;

+----------------------------+-------+--------+--------+--------+--------+--------+--------+--------+--------+
|             ts             | word1 | word2  | word3  | word4  | word5  | word6  | word7  | word8  | word9  |
+----------------------------+-------+--------+--------+--------+--------+--------+--------+--------+--------+
| 2017-06-16 08:15:05.000000 | 2DF0  | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 2017-06-16 08:15:06.000000 | 2EF0  | 0000   | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 2017-06-16 08:15:07.000000 | 2DF0  | AAAA   | BBBB   | CCCC   | (null) | (null) | (null) | (null) | (null) |
| 2017-06-16 08:15:08.000000 | 2EF0  | 1111   | 2222   | (null) | (null) | (null) | (null) | (null) | (null) |
| 2017-06-16 08:15:09.000000 | 2DF0  |        | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 2017-06-16 08:15:10.000000 | 2EF0  | DDDD   | EEEE   | (null) | (null) | (null) | (null) | (null) | (null) |
+----------------------------+-------+--------+--------+--------+--------+--------+--------+--------+--------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多