【发布时间】: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