① HBase怎么实现海量数据的毫秒级查询
逻辑运算符极其优先次序
C语言中提供了三种逻辑运算符:
1) && 与运算
2) || 或运算
3) ! 非运算
与运算符&&和或运算符||均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
!(非)→&&(与)→||(或)
“&&”和“||”低于关系运算符,“!”高于算术运算符。
按照运算符的优先顺序可以得出:
a>b && c>d 等价于 (a>b)&&(c>d)
!b==c||d<a 等价于 ((!b)==c)||(d<a)
a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
② hbase如何根据某个列的值,查询出这个列的ro
刚才理解错了,你是要在C列显示对应A列的B列值,修改一下答案
在c列第一个单元格C1复制如下公式:
=VLOOKUP(A1,sheet1!$A$1:$B$n,2,0)
其中n为A列最后一个单元格行数
然后把B1向下填充到其他B列单元格,公示应该会自动变为
=VLOOKUP(A2,sheet1!$A$1:$B$n,2,0)
=VLOOKUP(A3,sheet1!$A$1:$B$n,2,0)
......
=VLOOKUP(An,sheet1!$A$1:$B$n,2,0)
这样应该可行,我没试验过你这种情况。你应该仔细看看VLOOKUP()这个函数的用法
下面是我给别人写的,不过对方说没看懂,你看看:
如果你有一个数据表,而另一个表格需要自动读取这个数据表内的数据,函数VLOOKUP()就很有用了。
下面简单说一下:
函数VLOOKUP()用法:
例子 公式如下
=VLOOKUP(F5,Sheet2!$F$4:$W$957,2,0)
其中第一个参数F5为查找值,即使用该公式的单元格内的数据是根据F5单元格内的数据查找出来的,例如你把姓名放在F列,其中F5是一个叫张三的人,G列是身份证号。G5要查找张三的身份证号,就可以在G5用函数VLOOKUP()
第二个参数是数据表,就是由哪一个数据表的哪几列数据为查找范围,【Sheet2!】就是数据表名,$F$4(F4)就是范围的左上角单元格,$W$957(W957)就是右下角单元格,查找范围就是在这个矩形内。其中F列数据必须是第一个参数F5的比照列,简单来说就是第一个参数F5的数值应该在查找的数据表的F列内。且F列必须是查找范围的第一个列该公式才起作用。举例你要查找张三,那么张三在Sheet2数据表查找范围内的所在列必须是查找范围内的第一列。F4写成$F$4是为了固定该单元格,否则在复制公式的时候excel会自动递加单元格数值,F4在复制的时候可能会变成F5、F6...,造成查找范围改变
第三个参数是列数,就是该函数返回的是第几列的数值,该列数是相对列数,即查找范围内的第几列。例如Sheet2工作表内的F列在整个表格内属于第6列,但在查找范围内的相对列数是第1列。假如张三的身份证在G列内,那么就是返回查找范围的第二列。
第四个参数是匹配条件,一般为0。
下面举一个具体使用的例子。
假设你有一个excel文件,里面的sheet1工作表记录的是单位人员姓名及人员身份证号,你现在需要创建一个新excel文件,记录单位人员的三险一金,里面需要输入人员的身份证号,如果再一个一个输入,重复劳动效率低不说,很有可能输错了,这时候你就可以从以前那个excel文件中读取这些人员的身份证号。
在新表中先输入人员姓名(如果你用人员序号作比对的话,姓名也可以自动读取),然后在需要输入身份证号的地方点击上面的【fx】,出现【插入函数】的对话框,在类别中选择【查找和引用】,最后一个就是VLOOKUP,选中它,点【确定】,然后出现【函数参数】对话框,【Lookup-value】为第一个参数,点击旁边的表格红箭头图标,选中新表中需要查找身份证号的那个人的姓名单元格;【table-array】为第二个参数,顾名思义是表格数组,包含行列的一个范围,就是查找范围,点击旁边表格红箭头图标,在老表sheet1中框选所有姓名和身份证号,保证老表中姓名在第一列;【col-index-num】为第三个参数,看看老表中身份证号在选择范围是第几列,就写上几。假如老表内身份证号紧跟着姓名,因为姓名列是范围内的第一列,那么身份证号就是第二列;【range-lookup】为第四个参数,写上0。全部弄好以后,回到新表看看身份证号是不是已经自动读出来了。如果没有一是查查这个人在老表中有没有,名字有没有空格,还有你选择的第三个参数列数对不对,注意有没有隐藏列,因为隐藏列虽然看不到,但是也计算在列数里面。如果没问题,将公示复制到所有需要读取身份证的单元格内。
这样有一个问题,因为你新表读取的是文件外的数据,所以必须保证老表文件位置不能变动,否则新表就不知道去哪里找数据了。解决方法有三个,一是保证老表文件位置永远不动(废话);二是在操作前先把老表数据复制到新表所在的文件内,单独作为一个sheet工作表存在,然后再查找新表复制后的数据,因为在同一个文件内,不用担心数据源丢失问题;三是不复制老表,新表读取数据后,选中读取的数据,点击【复制】,然后在原位置点击【选择性粘贴】,选中粘贴【数据】,这样公式会被公式读取的数据覆盖,就和数据源没有关系了。
还会遇到一个问题,如果老表没有数据,比如说老表内李四这个人当时就没有输入身份证号,那么新表内李四用公式查出来的身份证号并不是空,而是0,解决这个问题需要加一个if判断语句,如下:
=IF(你的公式=0,"",你的原公式)
还有就是,如果数据查找出错,会出现#N/A或者#VALUE,也可以用if语句取消,如下:
=IF(ISERROR(你的公式),"",你的公式)
不过不建议这样做,有错误提示才能知道去查找公式是不是有问题,公式没问题自然不会出现错误提示,没必要人为取消。
③ 如何用hive查询hbase中的数据
第一步,启动hadoop,命令:./start-all.sh
第二步,启动hive,命令:
./hive --auxpath /home/dream-victor/hive-0.6.0/lib/hive_hbase-handler.jar,/home/dream-victor/hive-0.6.0/lib/hbase-0.20.3.jar,/home/dream-victor/hive-0.6.0/lib/zookeeper-3.2.2.jar -hiveconf hbase.master=127.0.0.1:60000
这里,-hiveconf hbase.master=指向自己在hbase-site.xml中hbase.master的值
第三步,启动hbase,命令:./start-hbase.sh
第四步,建立关联表,这里我们要查询的表在hbase中已经存在所以,使用CREATE EXTERNAL TABLE来建立,如下:
CREATE EXTERNAL TABLE hbase_table_2(key string, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "data:1")
TBLPROPERTIES("hbase.table.name" = "test");
�0�2hbase.columns.mapping指向对应的列族;多列时,data:1,data:2;多列族时,data1:1,data2:1;
�0�2hbase.table.name指向对应的表;
�0�2hbase_table_2(key string, value string),这个是关联表
我们看一下HBase中要查询的表的结构,
④ 用happybase happy地查询hbase数据
用happybase进行hbase中数据的增删改查
前提:已经安装happybase库(pip install happybase),已有hbase环境并开启thrift通讯端口(nohup hbase thrift start &),thrift默认端口为9090,10.10.30.200为hbase主机ip
scan方法:
参数:
row_start、row_stop:起始和终止rowkey,查询两rowkey间的数据
row_prefix:rowkey前缀。注:使用row_prefix的时候,row_start和row_stop不能使用
filter:要使用的过滤器(hbase 0.92版本及以上生效)
timestamp:按指定时间戳查询
reverse:默认为False。为True时,scan结果按rowkey倒序排列
e.g:
put方法:
e.g:
△ 如put中的rowkey已存在,则为修改数据
delete方法:
row:删除rowkey为row的数据
columns:指定columns参数时,删除
e.g:
删除rowkey为student2的name数据:
删除成功:
batch方法:
1、批量操作
2、使用with管理批量
row方法及rows()方法,检索指定rowkey的数据
检索一条:
检索多条:
返回结果:
e.g:
结果:
暂时就这些0v0
⑤ 如何获取hbase数据查询 语句
get命令和HTable类的get()方法用于从HBase表中读取数据。使用 get 命令,可以同时获取一行数据。它的语法如下:
get ’<table name>’,’row1’
下面的例子说明如何使用get命令。扫描emp表的第一行。
hbase(main):012:0> get 'emp', '1'
COLUMN CELL
personal : city timestamp=1417521848375, value=hyderabad
personal : name timestamp=1417521785385, value=ramu
professional: designation timestamp=1417521885277, value=manager
professional: salary timestamp=1417521903862, value=50000
4 row(s) in 0.0270 seconds
读取指定列
下面给出的是语法,使用get方法读取指定列。
hbase>get 'table name', ‘rowid’, {COLUMN => ‘column family:column name ’}
下面给出的示例,是用于读取HBase表中的特定列。
hbase(main):015:0> get 'emp', 'row1', {COLUMN=>'personal:name'}
COLUMN CELL
personal:name timestamp=1418035791555, value=raju
⑥ spark1.2.1实现读取hbase的数据后怎么实现实时查询
WordCountHbaseReaderMapper类继承了TableMapper抽象类,TableMapper类专门用于完成MapRece中Map过程与Hbase表之间的操作。此时的map(ImmutableBytesWritablekey,Resultvalue,Contextcontext)方法,第一个参数key为Hbase表的rowkey主键,第二个参数value为key主键对应的记录集合,此处的map核心实现是遍历key主键对应的记录集合value,将其组合成一条记录通过contentx.write(key,value)填充到键值对中。详细源码请参考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.{@Overrideprotectedvoidmap(ImmutableBytesWritablekey,Resultvalue,Contextcontext)throwsIOException,InterruptedException{StringBuffersb=newStringBuffer("");for(Entryentry:value.getFamilyMap("content".getBytes()).entrySet()){Stringstr=newString(entry.getValue());//将字节数组转换为String类型if(str!=null){sb.append(newString(entry.getKey()));sb.append(":");sb.append(str);}context.write(newText(key.get()),newText(newString(sb)));}}}3、Recer函数实现此处的WordCountHbaseReaderRece实现了直接输出Map输出的键值对,没有对其做任何处理。详细源码请参考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.{privateTextresult=newText();@Overrideprotectedvoidrece(Textkey,Iterablevalues,Contextcontext)throwsIOException,InterruptedException{for(Textval:values){result.set(val);context.write(key,result);}}}4、驱动函数实现与WordCount的驱动类不同,在Job配置的时候没有配置job.setMapperClass(),而是用以下方法执行Mapper类:TableMapReceUtil.initTableMapperJob(tablename,scan,WordCountHbaseReaderMapper.class,Text.class,Text.class,job);该方法指明了在执行job的Map过程时,数据输入源是hbase的tablename表,通过扫描读入对象scan对表进行全表扫描,为Map过程提供数据源输入,通过WordCountHbaseReaderMapper.class执行Map过程,Map过程的输出key/value类型是Text.class与Text.class,最后一个参数是作业对象。特别注意:这里声明的是一个最简单的扫描读入对象scan,进行表扫描读取数据,其中scan可以配置参数,这里为了例子简单不再详述,用户可自行尝试。详细源码请参考:WordCountHbaseReader\src\com\zonesion\hbase\WordCountHbaseReader.javapublicstaticvoidmain(String[]args)throwsException{Stringtablename="wordcount";Configurationconf=HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum","Master");String[]otherArgs=newGenericOptionsParser(conf,args).getRemainingArgs();if(otherArgs.length!=1){System.err.println("Usage:WordCountHbaseReader");System.exit(2);}Jobjob=newJob(conf,"WordCountHbaseReader");job.setJarByClass(WordCountHbaseReader.class);//设置任务数据的输出路径;FileOutputFormat.setOutputPath(job,newPath(otherArgs[0]));job.setRecerClass(WordCountHbaseReaderRece.class);Scanscan=newScan();TableMapReceUtil.initTableMapperJob(tablename,scan,WordCountHbaseReaderMapper.class,Text.class,Text.class,job);//调用job.waitForCompletion(true)执行任务,执行成功后退出;System.exit(job.waitForCompletion(true)?0:1);}5、部署运行1)启动Hadoop集群和Hbase服务[hadoop@K-Master~]$start-dfs.sh#启动hadoopHDFS文件管理系统[hadoop@K-Master~]$start-mapred.sh#启动hadoopMapRece分布式计算服务[hadoop@K-Master~]$start-hbase.sh#启动Hbase[hadoop@K-Master~]$jps#查看进程