我们有一个在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位无符号整数导入配置单元,然后使用位提取java函数为每个查询构造一个mapreduce作业,以构造一个临时表,其中包含一个时间戳字段和每个字段 bit
对自己的一级整数感兴趣。我们可以说,从临时查询中获得最终结果所需的hadoop查询是微不足道的。
然而,目前提出的想法是将十六进制文本直接保存到数据池中。我们的数据科学家似乎认为这样的安排将允许直接查询;也就是说,不需要临时表,十六进制格式提供了合理有效的存储。
这是怎么回事?有没有办法索引这些文本,然后对其进行某种位级的文本搜索,屏蔽掉不感兴趣的位?
(我将考虑如何更好地解决这个问题的建议。)
1条答案
按热度按时间tf7tbtn21#
演示
数据.tsv
替代数据结构