这篇文章是《 七周七个数据库》中 Hbase第二天的回顾。
大部分命令和脚本可以在GitHub上找到: https : //github.com/eyalgo/seven-dbs-in-seven-weeks/tree/master/hbase/day_2

流脚本

第2天的第一件事是下载大量数据(大数据)并将其流式传输到Hbase。 有一个JRuby脚本,我必须对其进行更改才能使其工作: https : //github.com/eyalgo/seven-dbs-in-seven-weeks/blob/master/hbase/day_2/import_from_wikipedia.rb

正如书所建议的那样,在对其进行了更改之后,我不得不对列族进行一些压缩。 之后,我可以运行脚本:

curl http://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2 | bzcat | /opt/hbase/hbase-0.94.18/bin/hbase shell /home/eyalgo/seven-dbs-in-seven-weeks/hbase/day_2/import_from_wikipedia.rbcurl http://dumps.wikimedia.org/enwiktionary/latest/enwiktionary-latest-pages-articles.xml.bz2 | bzcat | /opt/hbase/hbase-0.94.18/bin/hbase shell import_from_wikipedia.rb

这是脚本运行时的输出

1 10.0G    1  128M    0     0   456k      0  6:23:37  0:04:48  6:18:49  817k19000 records inserted (Serotonin)1 10.0G    1  131M    0     0   461k      0  6:19:03  0:04:51  6:14:12  921k19500 records inserted (Serotonin specific reuptake inhibitors)1 10.0G    1  135M    0     0   469k      0  6:12:45  0:04:54  6:07:51 1109k20000 records inserted (Tennis court)1 10.0G    1  138M    0     0   477k      0  6:06:12  0:04:57  6:01:15 1269k20500 records inserted (Tape drive)

本章的下一部分将讨论区域和其他一些管道内容。

构建链接表

在此部分中,源是大的Wiki表,输出是“链接”表。 每个链接都有“发件人:”和“收件人:”。 这是更改后的工作脚本的链接: https : //github.com/eyalgo/seven-dbs-in-seven-weeks/blob/master/hbase/day_2/generate_wiki_links.rb

本章的其余部分显示了如何查看数据,对数据进行计数等等。

家庭作业

作业的主要部分是创建一个新表:“ foods”,该表从XML中获取数据,可以从美国的健康与营养站点下载该数据。 该数据显示每种食物的营养成分。

我决定创建一个非常简单的表。 列族没有任何特殊选项。 我创建了一个专栏文章: 事实 。 XML文件中的每一行数据都是事实的一部分。 我还决定该行的键为Display_Name 。 毕竟,按键而不是按ID查找要容易得多。

create 'foods' , 'facts'

为了了解如何创建脚本,我查看了两个资源:

  1. 为Wiki表导入数据的脚本
  2. XML中的一种元素(食物)

这是一个元素:

<Food_Display_Row><Food_Code>12350000</Food_Code><Display_Name>Sour cream dip</Display_Name><Portion_Default>1.00000</Portion_Default><Portion_Amount>.25000</Portion_Amount><Portion_Display_Name>cup </Portion_Display_Name><Factor>.25000</Factor><Increment>.25000</Increment><Multiplier>1.00000</Multiplier><Grains>.04799</Grains><Whole_Grains>.00000</Whole_Grains><Vegetables>.04070</Vegetables><Orange_Vegetables>.00000</Orange_Vegetables><Drkgreen_Vegetables>.00000</Drkgreen_Vegetables><Starchy_vegetables>.00000</Starchy_vegetables><Other_Vegetables>.04070</Other_Vegetables><Fruits>.00000</Fruits><Milk>.00000</Milk><Meats>.00000</Meats><Soy>.00000</Soy><Drybeans_Peas>.00000</Drybeans_Peas><Oils>.00000</Oils><Solid_Fats>105.64850</Solid_Fats><Added_Sugars>1.57001</Added_Sugars><Alcohol>.00000</Alcohol><Calories>133.65000</Calories><Saturated_Fats>7.36898</Saturated_Fats>
</Food_Display_Row>

我通过检查Wiki脚本和一个元素创建了脚本。 打开文档是在看到一个打开的XML元素标签: Food_Display_Row时 。 当将Food_Display_Row视为关闭标签时,脚本将创建文档。

include Java
import 'org.apache.hadoop.hbase.client.HTable'
import 'org.apache.hadoop.hbase.client.Put'
import 'org.apache.hadoop.hbase.HBaseConfiguration'
import 'javax.xml.stream.XMLStreamConstants'def jbytes( *args )args.map { |arg| arg.to_s.to_java_bytes }
endfactory = javax.xml.stream.XMLInputFactory.newInstance
reader = factory.createXMLStreamReader(java.lang.System.in)document = nil
buffer = nil
count = 0puts( @hbase )
conf = HBaseConfiguration.new
table = HTable.new( conf, "foods" )
table.setAutoFlush( false )while reader.has_nexttype = reader.nextif type == XMLStreamConstants::START_ELEMENT # (3)case reader.local_namewhen 'Food_Display_Row' then document = {}when /Display_Name|Portion_Default|Portion_Amount|Portion_Display_Name|Factor/ then buffer = []when /Increment|Multiplier|Grains|Whole_Grains|Vegetables|Orange_Vegetables/ then buffer = []when /Drkgreen_Vegetables|Starchy_vegetables|Other_Vegetables|Fruits|Milk|Meats/ then buffer = []when /Drybeans_Peas|Soy|Oils|Solid_Fats|Added_Sugars|Alcohol|Calories|Saturated_Fats/ then buffer = []endelsif type == XMLStreamConstants::CHARACTERSbuffer << reader.text unless buffer.nil?elsif type == XMLStreamConstants::END_ELEMENTcase reader.local_namewhen /Display_Name|Portion_Default|Portion_Amount|Portion_Display_Name|Factor/document[reader.local_name] = buffer.joinwhen /Increment|Multiplier|Grains|Whole_Grains|Vegetables|Orange_Vegetables/document[reader.local_name] = buffer.joinwhen /Drkgreen_Vegetables|Starchy_vegetables|Other_Vegetables|Fruits|Milk|Meats/document[reader.local_name] = buffer.joinwhen /Drybeans_Peas|Soy|Oils|Solid_Fats|Added_Sugars|Alcohol|Calories|Saturated_Fats/document[reader.local_name] = buffer.joinwhen 'Food_Display_Row'key = document['Display_Name'].to_java_bytesp = Put.new( key )p.add( *jbytes( "facts", "Display_Name", document['Display_Name'] ) )p.add( *jbytes( "facts", "Portion_Default", document['Portion_Default'] ) )p.add( *jbytes( "facts", "Portion_Amount", document['Portion_Amount'] ) )p.add( *jbytes( "facts", "Portion_Display_Name", document['Portion_Display_Name'] ) )p.add( *jbytes( "facts", "Factor", document['Factor'] ) )p.add( *jbytes( "facts", "Increment", document['Increment'] ) )p.add( *jbytes( "facts", "Multiplier", document['Multiplier'] ) )p.add( *jbytes( "facts", "Grains", document['Grains'] ) )p.add( *jbytes( "facts", "Whole_Grains", document['Whole_Grains'] ) )p.add( *jbytes( "facts", "Vegetables", document['Vegetables'] ) )p.add( *jbytes( "facts", "Orange_Vegetables", document['Orange_Vegetables'] ) )p.add( *jbytes( "facts", "Drkgreen_Vegetables", document['Drkgreen_Vegetables'] ) )p.add( *jbytes( "facts", "Starchy_vegetables", document['Starchy_vegetables'] ) )p.add( *jbytes( "facts", "Other_Vegetables", document['Other_Vegetables'] ) )p.add( *jbytes( "facts", "Fruits", document['Fruits'] ) )p.add( *jbytes( "facts", "Milk", document['Milk'] ) )p.add( *jbytes( "facts", "Meats", document['Meats'] ) )p.add( *jbytes( "facts", "Drybeans_Peas", document['Drybeans_Peas'] ) )p.add( *jbytes( "facts", "Soy", document['Soy'] ) )p.add( *jbytes( "facts", "Oils", document['Oils'] ) )p.add( *jbytes( "facts", "Solid_Fats", document['Solid_Fats'] ) )p.add( *jbytes( "facts", "Added_Sugars", document['Added_Sugars'] ) )p.add( *jbytes( "facts", "Alcohol", document['Alcohol'] ) )p.add( *jbytes( "facts", "Calories", document['Calories'] ) )p.add( *jbytes( "facts", "Saturated_Fats", document['Saturated_Fats'] ) )table.put( p )count += 1table.flushCommits() if count % 10 == 0if count % 500 == 0puts "#{count} records inserted (#{document['Display_Name']})"endendend
endtable.flushCommits()
exit

以下是获取XML文件并将其流式传输到Hbase的Shell命令。 第一个命令针对具有单个元素的文件运行。 验证正确性后,我将其针对完整文件。

curl file:///home/eyalgo/seven-dbs-in-seven-weeks/hbase/day_2/food-display-example.xml | cat | /opt/hbase/hbase-0.94.18/bin/hbase shell /home/eyalgo/seven-dbs-in-seven-weeks/hbase/day_2/import_food_display.rbcurl file:///home/eyalgo/seven-dbs-in-seven-weeks/hbase/day_2/MyFoodapediaData/Food_Display_Table.xml | cat | /opt/hbase/hbase-0.94.18/bin/hbase shell /home/eyalgo/seven-dbs-in-seven-weeks/hbase/day_2/import_food_display.rb

我们去吃点饭吧...

get 'foods' , 'fruit smoothie made with milk'

结果:

COLUMN CELL
facts:Added_Sugars timestamp=1399932481440, value=82.54236
facts:Alcohol timestamp=1399932481440, value=.00000
facts:Calories timestamp=1399932481440, value=197.96000
facts:Display_Name timestamp=1399932481440, value=fruit smoothie made with milk
facts:Drkgreen_Vegetables timestamp=1399932481440, value=.00000
facts:Drybeans_Peas timestamp=1399932481440, value=.00000
facts:Factor timestamp=1399932481440, value=1.00000
facts:Fruits timestamp=1399932481440, value=.56358
facts:Grains timestamp=1399932481440, value=.00000
facts:Increment timestamp=1399932481440, value=.25000
facts:Meats timestamp=1399932481440, value=.00000
facts:Milk timestamp=1399932481440, value=.22624
facts:Multiplier timestamp=1399932481440, value=.25000
facts:Oils timestamp=1399932481440, value=.00808
facts:Orange_Vegetables timestamp=1399932481440, value=.00000
facts:Other_Vegetables timestamp=1399932481440, value=.00000
facts:Portion_Amount timestamp=1399932481440, value=1.00000
facts:Portion_Default timestamp=1399932481440, value=2.00000
facts:Portion_Display_Name timestamp=1399932481440, value=cup
facts:Saturated_Fats timestamp=1399932481440, value=1.91092
facts:Solid_Fats timestamp=1399932481440, value=24.14304
facts:Soy timestamp=1399932481440, value=.00000
facts:Starchy_vegetables timestamp=1399932481440, value=.00000
facts:Vegetables timestamp=1399932481440, value=.00000
facts:Whole_Grains timestamp=1399932481440, value=.00000

翻译自: https://www.javacodegeeks.com/2014/05/seven-databases-in-seven-weeks-hbase-day-2.html

七个星期中的七个数据库– Hbase第二天相关推荐

  1. hbase数据库 数据存入_七个星期中的七个数据库– Hbase第二天

    hbase数据库 数据存入 这篇文章是< 七个星期的七个数据库>一书中Hbase第二天的回顾. 大部分命令和脚本可以在GitHub上找到: https : //github.com/eya ...

  2. 计算机网络中的七层模型

    最近又看到这个七层模型了,一直都记不住这个七层模型,就算背住了也很快忘记.主要原因还是因为没有真实的使用场景,也没能理解其中的原理.但是这个东西是计算机网络的基础,既然碰巧看到就顺便整理一下吧.很多知 ...

  3. 分析婚姻中的七年之痒问题

    本文转载于 http://qg.sifanghua.cn/hunyin/16758.html 分析婚姻中的七年之痒问题 时间:2010-08-01 09:32来源:未知 作者:私房话 有人说,不管糖果 ...

  4. python字典、列表、元祖使用场景_python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍...

    python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 元祖跟列表类似.只不过是有区别的. 如下: tuple(元祖英文) 跟列表类似, 元素不能 ...

  5. 网络中的七层协议与TCP/IP五层模型

    socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程 ...

  6. ONNX系列七 --- 在Python中使用可移植的ONNX AI模型

    目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...

  7. 在 Laravel 5 中集成七牛云存储实现云存储功能

    本扩展包基于https://github.com/qiniu/php-sdk开发,是七牛云储存 Laravel 5 Storage版,通过本扩展包可以在Laravel 5中集成七牛云存储功能. 1.安 ...

  8. 榆树计算机课,吉林省榆树市弓棚镇武龙中学校七年级信息技术:第九课 Excel表格计算 教案+课件 (2份打包)...

    ID:8701298 分类: 吉林 , 2018 资源大小:2626KB 资料简介: 课 题Word表格 课型新授课第 1 课时教材分析本节课内容是长春版<信息技术>第九课的内容,学习制作 ...

  9. LINUX中的七种文件类型

    在liunx下一切皆文件. LINUX中的七种文件类型 d 目录文件. l 符号链接(指向另一个文件,类似于window下的快捷方式): s 套接字文件: b 块设备文件,二进制文件: c 字符设备文 ...

最新文章

  1. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)
  2. 【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )
  3. layui前端页面table表格怎么格式化转换时间_前端开发面经知识点总结
  4. oracle故障级别划分,jfinal 2.2 oracle 事务级别问题
  5. 从无主之地看FPS+ARPG游戏的发展方向
  6. MySQL8.0 - 新特性 - 说说InnoDB Log System的隐藏参数
  7. TypeScript Never 与 Unknown
  8. 软件基本功:不会代码共用,因为没有设计能力;代码共用都不会,谈什么设计
  9. matlab如何画出来地球,matlab绘制地球
  10. MySQL 驱动的下载方法
  11. 2019/10/13中国工商银行笔试编程题
  12. ttk progress bar的显示
  13. Illegal character in opaque part at index
  14. Promise 入门
  15. Java Math类方法介绍之史上最全
  16. 2019/01/29 一位前端实习生 艰辛过程 励志 实习周记(五)——第六周
  17. 真菌多样性分析ITS序列
  18. Matlab-LSB信息隐藏实验
  19. mac 苹果电脑升级系统后蓝牙耳机只有一边有声音 苹果电脑连接耳机音质不好 苹果电脑浏览网页音视频嘈杂
  20. 05.数据的深度分析(数据挖掘、机器学习)--《数据科学概论》

热门文章

  1. 螺钉式接线端子 KF128/ DG128/ MG128
  2. 重回coding时代 spark hadoop winutils 报错
  3. 计算机实验楼应用需求分析,校园网络信息化需求分析报告
  4. [Python] 错误“IndentationError: unindent does not match any outer indentation level”是什么意思?...
  5. vins安装及小觅深度版运行
  6. linux进程与服务管理,linux基础之进程管理与服务
  7. java计算机毕业设计疫情物质管理系统源码+数据库+lw文档+系统+部署
  8. 上海电影院分布数据接口
  9. 【Qt】 Fractal Designer 5.2 - Help(中文版)
  10. python利用列表计算斐波那契数列前30项_使用python计算斐波那契数列