hbase filter及rowkey范围检索使用并对结果集处理
来源:互联网 发布:focusky for mac 破解 编辑:程序博客网 时间:2024/06/05 03:50
hbase新API操作hbase过滤器之后对结果集进行处理生成spark临时表用于后续处理。
注意hbase中,表中存储的数据类型必须一一对应,否则会因为解码问题,导致最后结果非常的混乱
代码如下: (如有大神看到,请不吝赐教,交流邮箱1970497138@qq.com)
val show_info_one:Array[(String,String,String)] = Array(//查找需要使用的列 填充此处 ("cf","user_id","Long"), ......... ) //注册成的表名:ywapp_bigdata_user_score_tmp FilterRowkeyGetHtable(sp,"db_oss_ywgl:ywapp_bigdata_user_score",show_info_one,getDateTime(0))sp.sql("select * from ywapp_bigdata_user_score_tmp limit 10").show() sp.sql("select count(1) from ywapp_bigdata_user_score_tmp").show() val show_info_two:Array[(String,String,String)] = Array( //查找需要使用的列 填充此处 ("cf","user_id","Long"), ......... ) //注册成的表名:ywapp_bigdata_user_indicator_tmp FilterRowkeyGetHtable(sp,"db_oss_ywgl:ywapp_bigdata_user_indicator",show_info_two,getDateTime(0)) sp.sql("select * from ywapp_bigdata_user_indicator_tmp limit 10").show() sp.sql("select count(1) from ywapp_bigdata_user_indicator_tmp").show()
/** * 根据rowkey进行数据筛选 * 测试:使用scan的setStartRow设置rowkey的起始位置, * 可以指定rowkey的前缀进行匹配查询, * 不可以指定rowkey中间的一部分进行数据筛选 * @param sparkSesson * @param tbl_nm 表名 * @param show_info 展示的列名(cf,col_nm,valueType) * @param tuple rowkey对日期筛选的条件,startTime,endTime 区间是[startTime,endTime) * @param filters 过滤器元素(cf,col_nm,filterValue),默认为空 * 注册成临时表:tabl_nm_tmp */ private def FilterRowkeyGetHtable(sparkSesson:SparkSession,tbl_nm:String,show_info:Array[(String,String,String)],tuple:Tuple2[String,String],filters:Array[(String,String,String)]=Array(("","",""))): Unit ={ val sparkContext = sparkSesson.sparkContext val sqlContext = sparkSesson.sqlContext val hbaseconf = HBaseConfiguration.create() hbaseconf.set(TableInputFormat.INPUT_TABLE,tbl_nm) val table = new HTable(hbaseconf,tbl_nm) val scan = new Scan() scan.setStartRow(Bytes.toBytes(tuple._1)) scan.setStopRow(Bytes.toBytes(tuple._2)) //添加自定义过滤器 if(filters.length>0){ for(filter<-filters){ val f = new SingleColumnValueFilter(Bytes.toBytes(filter._1),Bytes.toBytes(filter._2),CompareFilter.CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes( filter._3))) scan.setFilter(f) } } for(i <- show_info){ scan.addColumn(Bytes.toBytes(i._1),Bytes.toBytes(i._2)) } val ScannerRes = table.getScanner(scan) val ColumnValueScanner = ScannerRes.iterator() /** * -------------------------重点----------------------------- * 将扫描得到的结果值转换成可以匹配注册表用的RDD[ROW] * 使用 * * 此处对ColumnValueScanner的处理不完善,需要后续修改,查找有效的方法 */ val listRow = new util.ArrayList[Row]() var flag = true while(ColumnValueScanner.hasNext){ try{ //每个result都是一行数据 val r:Result = ColumnValueScanner.next() val arr = ArrayBuffer[Any]() //正常此处需要根据structType中元素类型,以及表中元素的类型指定类型,但是此处由于部分未知原因,转换为其他类型会报错,故统一转换成String //获取rowkey arr+=Bytes.toString(r.getRow) //*************---------------------------此处需要指定每列的类型进行模式匹配处理 for(col<-show_info){ col._3 match { case "Float"=>{ val v = r.getValue(col._1.getBytes(),col._2.getBytes()) //此部分由于类型转换内部存在调用bytes.length操作,需要对空指针数据进行处理 if(v!=null)arr+=Bytes.toFloat(v) else arr+=v } case "Int"=>{ val v = r.getValue(col._1.getBytes(),col._2.getBytes()) if(v!=null)arr+=Bytes.toInt(v) else arr+=v } case "Double"=>{ val v = r.getValue(col._1.getBytes(),col._2.getBytes()) if(v!=null)arr+=Bytes.toDouble(v) else arr+=v } case "Long"=>{ val v = r.getValue(col._1.getBytes(),col._2.getBytes()) if(v!=null)arr+=Bytes.toLong(v) else arr+=v } case "String"=>{ val v = r.getValue(col._1.getBytes(),col._2.getBytes()) if(v!=null)arr+=Bytes.toString(v) else arr+=v } case _=>{ val v = r.getValue(col._1.getBytes(),col._2.getBytes()) if(v!=null)arr+=Bytes.toString(v) else arr+=v } } } val row = Row.fromSeq(arr.toSeq) listRow.add(row) }catch{ case e:Exception=> e.printStackTrace() } } //构建RDD //val seqRDD = sc.makeRDD(arr) val schema = StructType({ val list = new util.ArrayList[StructField]() list.add(StructField("rowkey",StringType,true)) for(col<-show_info){ col._3 match{ case "Float"=>list.add( StructField(col._2,FloatType,true)) case "Int"=>list.add( StructField(col._2,IntegerType,true)) case "Double"=>list.add( StructField(col._2,DoubleType,true)) case "Long"=>list.add( StructField(col._2,LongType,true)) case "String"=>list.add( StructField(col._2,StringType,true)) case _=>list.add( StructField(col._2,StringType,true)) } } list } ) //创建dataframe val df = sqlContext.createDataFrame(listRow,schema) val tbl = tbl_nm.split(":")(1) df.createTempView(tbl+"_tmp") // println("----------------------------------"+sqlContext.sql(s"select * from $tbl"+"_tmp").count()) ScannerRes.close() }
阅读全文
0 0
- hbase filter及rowkey范围检索使用并对结果集处理
- HBASE Rowkey filter
- hbase根据rowKey范围批量删除
- Hbase初始化并根据RowKey获取数据
- Hbase初始化并根据RowKey获取数据
- Mysql对检索结果进行处理后返回以及在列上使用函数
- hbase rowkey
- HBase RowKey
- 【bloom filter】对HBase中Bloomfilter类型的设置及使用的理解
- K-Means算法过程及代码实现,并对结果使用ARI进行评估
- hbase filter使用
- HBase Filter使用介绍
- Filter的使用及处理特殊请求
- hbase rowkey热点问题
- HBASE rowkey设计
- 【HBase】Rowkey设计
- hbase rowkey设计
- Hbase rowkey设计
- 优化 UWP 中图片的内存占用
- web项目中各种路径的获取
- wpi http 报错
- 非常详细的 Docker 学习笔记
- shell中的字母大小写转换
- hbase filter及rowkey范围检索使用并对结果集处理
- SAP Fiori 2.0中文版系列视频教程(中文首发)
- c++语言的空格问题
- 从控制层返回到js的json数据带“\”转译符,怎么去掉
- 对抗神经网络,梦,潜意识
- switch… case 语句的用法
- 用户兴趣模型分类以及推荐系统技术调研
- 使用 Azure CLI 创建 Linux 虚拟机
- Restful获取Path所有占位符,Context的使用