java spark hbase scan过滤查询

最近用java从hbase中 做spark清洗,由于需要根据key模糊查询,便在网上找了各种资料,凑合一块儿给弄出来了。

1、获取spark上下文,其中的 PropertiesUtils 是一个工具类,可以自己去写,就是加载spark的配置文件

public static JavaSparkContext getSparkConf() {
        SparkConf sparkConf = new SparkConf();
        Properties properties = PropertiesUtils.loadProperties("spark.properties");
        Set propertiesNameSet = properties.stringPropertyNames();
        for (String propertiesName : propertiesNameSet) {
            sparkConf.set(propertiesName, properties.getProperty(propertiesName));
        }
        return new JavaSparkContext(sparkConf);;
    }


2、获取hbase的配置文件

    public static Configuration getHbaseConfig() {
        Properties properties = PropertiesUtils.loadProperties("hbase.properties");
        Set propertiesNameSet = properties.stringPropertyNames();
        Configuration hbaseConfig = HBaseConfiguration.create();
        for (String propertiesName : propertiesNameSet) {
            hbaseConfig.set(propertiesName, properties.getProperty(propertiesName));
        }
        return hbaseConfig;
    }

3、获取scan的String对象  COLUMN_FAMILY_BYTES为列族,ROW_PREFIX为rowkey前缀

public static String buildScanString(){
Scan scan = new Scan();
scan.addFamily(COLUMN_FAMILY_BYTES);
scan.setCacheBlocks(false); 
Filter filter = new PrefixFilter(Bytes.toBytes(ROW_PREFIX));
scan.setFilter(filter);
ClientProtos.Scan proto = null;
try {
proto = ProtobufUtil.toScan(scan);
} catch (IOException e) {
e.printStackTrace();
}
return Base64.encodeBytes(proto.toByteArray());
}

4、获取rdd

public static JavaRDD queryOrderRddInHbase(JavaSparkContext sc){
hbaseConfig.set(TableInputFormat.INPUT_TABLE, INPUT_HBASE_TABLE_NAME);
hbaseConfig.set(TableInputFormat.SCAN,buildScanString());
JavaPairRDD hBaseRDDPair = sc.newAPIHadoopRDD(hbaseConfig, TableInputFormat.class,ImmutableBytesWritable.class, Result.class);  
JavaRDD resultRdd = hBaseRDDPair.values();
Long count = resultRdd.count();
        System.out.println("count: " + count); 
        return resultRdd;
}

以上只要打印出条数便说明程序正确运行了,在正式运行时可以把Long count = resultRdd.count();这一句和控制台的打印给注释掉。

你可能感兴趣的:(BIG_DATA)