从面向列的数据库(如 HBASE)访问数据
在查询 HBase 数据存储之前,需要在其中存储一些数据。
使用 1970 年代到 2010 年 2 月,纽约证券交易所的历史每日股票市场数据作为一个工作示例,加载到 HBase 实例中。此加载的数据集使用 HBase 样式的查询机制进行访问。历史市场数据由 Infochimp.org 整理,可以在 www.infochimps.com/datasets/ny… 查看。
整个数据集的压缩下载量很大,有199 MB,但按照HDFS和HBase标准来说非常小。HBase 和 Hadoop 基础架构能够并且经常用于处理跨多台物理机的 PB 级数据。我为示例选择了一个易于管理的数据集
数据在逻辑上分为三种不同的类型:
-
交易所、股票代码和日期的组合作为唯一 ID
-
开盘价、最高价、最低价、收盘价和调整后的收盘价是价格的衡量标准
-
每日交易量
行键可以使用交易所、股票代码和日期的组合来创建。因此,NYSE,AA,2008-02-27 可以结构化为 NYSEAA20080227 作为数据的行键。所有与价格相关的信息都可以存储在名为 price 的列系列中,交易量数据可以存储在名为 price 的列系列中。
表本身名为 historical_daily_stock_price。
要获取NYSE,AA,2008-02-27的行数据,可以按如下方式查询:
get 'historical_daily_stock_price','NYSEAA20080227'
您可以按如下方式获得开盘价:
get 'historical_daily_stock_price','NYSEAA20080227', 'price:open'
还可以使用编程语言来查询数据。
获取开放和高价数据的示例 Java 程序可能如下所示:
HBaseConnector.java HBase除了说明的内容之外,几乎没有高级查询技术,但它的索引和查询功能可以在Lucene和Hive的帮助下进行扩展。
查询 REDIS 数据存储
与MongoDB和HBase的情况一样,首先将示例数据集加载到 Redis 实例中。
使用 纽约市数据挖掘在线停车位的公共原始数据 作为例子,
数据下载地址: www.nyc.gov/data。
下载文件名为 parking_facilities.csv.参见示例,参考一个简单的 Python 程序,该程序解析此 CSV 数据集并将其加载到本地 Redis 存储中。在运行 Python 脚本以加载数据之前,请先启动本地 Redis 服务器。运行 Redis 安装目录中提供的 Redis 服务器程序将启动一个 Redis 服务器实例,默认情况下,该实例侦听端口 6379 上的客户端连接。
程序循环访问提取的哈希记录列表,并将值保存到 Redis 实例。每个哈希记录都使用许可证号进行键控。所有许可证编号本身都保存在名为 parking_facilities_set 的集中。
要获取名为 parking_facilities_list 的集合中所有许可证编号的列表,请通过另一个程序或命令行客户端进行连接,然后使用以下命令:
SMEMBERS parking_facilities_set
所有的1912个许可证号码将被打印出来。
您可以运行wc -1 paking_facilities.csv以验证此数字是否正确。
CSV 中的每一行对应一个停车设施,因此两个数字应协调。
对于每个停车设施,属性存储在哈希中,该哈希由表格parking_facility:<license_number>。因此,要查看与许可证编号1105006关联的哈希中的所有密钥,您可以使用以下命令:
HKEYS parking_facility:1105006
运行结果:
许可证编号1105006在 SMEMBERS parking_facilities_ set 命令返回的列表中排在第一位。但是,集合不是有序的,因此重新运行此命令可能会导致顶部的许可证编号不相同。
如果需要成员列表按特定顺序显示,请使用排序集。
要使用排序集,您需要做的就是将
r.sadd(“parking_facilities_set”, license_number)
中的行替换为以下内容:
if r.zadd(“parking_facilities_set”,license_number):
现在,您可以在哈希中查询特定值,例如设施类型,如下所示:
HGET parking_facility:1105006 facility_type
响应是“停车场”。您还可以使用 HVALS 命令打印出所有值,如下所示:
HVALS parking_facility:1105006
响应是:
当然,如果您可以在哈希中打印出所有键和相应的值,那就更好了。您可以使用 HGETALL 命令执行此操作,如下所示:
HGETALL parking_facility:1105006
响应如下:
有时,您可能不需要所有的键/值对,而只想打印出一组特定字段的值。
例如,您可能只想打印出address_city和address_zip_code,
如下所示:
HMGET parking_facility:1105006 address_city address_zip_code
响应是:
同样,您可以使用 HMSET 命令为一组字段设置值。若要获取密钥数的计数,可以使用 HLEN 命令,如下所示:
HLEN parking_facility:1105006
响应为 11如果要检查address_city是否是其中之一,可以使用 HEXISTs 命令来验证它是否作为键存在。该命令的使用方式如下:
HEXISTS parking_facility:1105006 address_city
如果字段存在,则响应为 1,如果不存在,则响应为0。
回到集合parking_facilities_set,您可能只想计算成员的数量,而不是使用 SCARD 命令将它们全部列出,如下所示:
SCARD parking_facilities_set
正如预期的那样,响应是 1912。您可以使用 SISMEMBER 命令验证集中是否存在特定成员。若要验证1005006是否为集合的成员,可以使用以下命令:
SISMEMBER parking_facilities_set 1105006
返回 0 和 1 的整数值以对应此查询的 false 和 true,该查询验证集合中是否存在成员。
本文正在参加「金石计划 . 瓜分6万现金大奖」