- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个包含几百万条记录的 Hbase 表。每条记录都有几个描述记录的属性,每个属性都存储在列限定符中。(主要是 int 或字符串值)我有一个要求,我应该能够看到根据列限定符(或者将来甚至不止一个)分页和排序的记录。这样做的最佳方法是什么?我已经使用协处理器(主要是来自华为的 hindex)研究了二级索引,但它似乎与我的用例不完全匹配。我还考虑过将所有数据复制到多个表中,每个表对应一个排序属性,这些属性将包含在 rowkey 中,然后将查询重定向到这些表。但这似乎很乏味,因为我已经有了一些所谓的属性..
感谢您的任何建议。
最佳答案
您需要您的 NoSQL 数据库像 RDBMS 一样工作,考虑到您的数据量,如果您坚持使用它,您的生活会简单得多,除非您期望指数增长 :) 此外,您没有提到是否您的数据得到更新,这对于做出正确的决定非常重要。
话虽如此,您有很多选择,这里有一些:
如果您可以等待结果:编写一个 MapReduce 任务来进行扫描、排序并检索前 X 行,对于每种排序类型您真的需要超过 1000 页(20-50k 行)吗?。另一种选择是使用类似 Hive 的东西.
如果您可以聚合数据并“缩减”数据集:编写一个 MapReduce 任务以定期将最新的聚合数据导出到 SQL 表(它将处理查询)。我已经这样做了几次,效果非常好,但这取决于您的要求。
如果您有足够的存储空间:编写一个 MapReduce 任务以定期为每个属性重新生成(或附加数据)一个新表(按行键排序)。您不需要多个表,只需在每种情况下的行键中使用一个前缀,或者,如果您不需要表并且不会有很多查询,只需将排序后的数据写入 csv 文件并将它们存储在HDFS,您的前端应用可以轻松读取它们。
手动维护二级索引:它不太能容忍模式更新和新属性,但对于接近实时的结果非常有用。为此,您必须更新代码以写入具有良好缓冲区的辅助表,以帮助提高性能,同时避免热点区域。想想这种类型的行键:[4B SORT FIELD ID (4 chars)] [8B SORT FIELD VALUE] [8B timestamp]
,只有一列存储主表的行键。要检索按任何字段排序的数据,只需使用 SORT FIELD ID 作为起始行 + 起始排序字段值作为分页基准执行扫描(忽略它以获取第一页,然后设置检索到的最后一页),即您将拥有主表的行键的方式,您可以对其执行 multiget 以检索完整数据。请记住,您需要一个小脚本来扫描主表并将数据写入现有行的索引表。
依靠您提到的通过协处理器进行的任何自动二级索引,尽管我根本不喜欢这个选项。
关于java - Hbase 按列限定符排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975405/
我一直在使用 OpenGL 编写程序。最近,我开始学习OpenGL着色语言。我是新手;因此,请在回答中详细说明。 我的问题是: GLSL 中有哪些不同类型的变量(限定符)? 它们的用途是什么? 它们有
这个问题在这里已经有了答案: typedef pointer const weirdness (6 个答案) 关闭 8 年前。 我有一个结构体 type_s。然后我将指向 struct type_s
我有一个 Point2D 类如下: class Point2D{ int x; int y; public: Point2D(int inX,
当应用于指向指针的指针等时,我在推断什么是 const 时遇到了一些麻烦。即,什么是 const 当你有 const Foo **foo; 我可以在这里更改 **foo 中的内容吗?如 foo[0]
限定符 有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。 下表给出了各种限定符及其含义的说
我有一个包含字符名称的数组结构。我想使用 qsort 按字母顺序对它们进行排序,但是我一直收到一条错误消息,说“初始化丢弃了指针目标类型中的‘const’限定符”。我相信我的 cmpmi() 函数和
我是 Java EE/JSF 的新手,现在阅读 CDI 限定符 - 更改类实现的可能性。这很好,但我有一个问题。据我了解,我可以使用限定符更改类实现,但我需要在使用此实现的任何地方更改它。在一个地方进
假设我有以下目录结构: $ mkdir -p a/1 $ ln -s a b 查找目录,我也得到了符号链接(symbolic link)中的目录: $ print -l */*(/) a/1 b/1
我正在尝试创建一个 const 结构数组,但我不断得到 error initializer element is not a compile time constant 我使用的是keil IDE。这
#include using namespace std; class Point { private: int x, y; // Private data members public:
我想使一个方法有条件地成为常量。也就是说,我们有 template class A { // stuff }; 根据模板参数的值,要么 void method() const; 或 void
由于 const int 特化导致以下错误: #include using std::cout; using std::endl; template void g(T val) { cou
同时适用于移动设备和平板电脑的 Titanium 项目,完美地完成了移动版本,但在平板设计时面临一些复杂性。 下面是 Titanium 支持的限定符矩阵,但我找不到任何针对 Android-Table
我正在研究 C++ 和 gtkmm,试图创建一个自定义类,它调用 .glade 文件来构建一个 Gtk 而不是基本的界面。此类派生自 Gtk::Window,但是当我调用类本身的 get_widget
我编写了以下代码来测试 const 成员函数:当我有数据成员的 const 限定符时,它编译并运行良好char *data 和构造函数的参数。但是,如果我从中删除 const数据成员和构造函数,我得到
您好,我正在使用 C++ 内置算法。我这里有这段代码: #include #include #include using namespace std; bool isDon(string& na
我的问题与 Time 项目有关,我将在下面完整发布该项目以提供背景信息。我所做的大部分都是正确的,但是当涉及到加法和减法运算符定义时,我遇到了范围界定错误的问题。编译器找不到我的私有(private)
我有以下代码- int acb(const uint16 *MsgPtr) { uint16 *p = (MsgPtr + 1); printf("%d", *p); } 我收到以下警告 - 在为 p
我在结构中有一个指向结构实例链表的指针字段。 struct myStruct { some fields... struct list_objects * volatile list;
所以我在维基百科的一篇文章(粗略翻译)中遇到了以下定义: Modifier (programming) - element of source code being a phrase of given
我是一名优秀的程序员,十分优秀!