类: QueryWithFilter

package com.atguigu.dataconsumer.query;

import com.atguigu.dataconsumer.util.HBaseFilterUtil;
import com.atguigu.dataconsumer.util.HBaseUtil;
import com.atguigu.dataconsumer.util.PropertyUtil;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class QueryWithFilter {
    public static void main(String[] args) throws IOException {
//        query("16480981069", 2018, 3, 21);
//        System.out.println("--------------");
//        query("16480981069", 2018, 3, -1);
//        System.out.println("--------------");
//        query("16480981069", 2018, -1, -1);

        queryBeginEnd("16480981069", "2018-03", "2018-12");
    }

    /**
     * 110  2018 1 1
     * 查询110 2018年1月1日所有通话记录
     * <p>
     * 110 2018 1 -1
     * 查询110 2018年1月1日的所有通话记录
     * <p>
     * 110 2018 -1 -1
     * 查询110 2018年的所有通话记录
     */
    public static void query(String phone, int year, int month, int day) throws IOException {
        Table table = HBaseUtil.getTable(PropertyUtil.getProperty("hbase.table.name"));
        if (month != -1 && day != -1) {  // 查询某一天
            queryOneDay(table, phone, year, month, day);
        } else if (month != -1 && day == -1) {  // 查询某一月
            queryOneMonth(table, phone, year, month);
        } else {  // 查询某一年
            queryOneYear(table, phone, year);
        }
    }

    /**
     * 查找某一个天
     *
     * @param table
     * @param phone
     * @param year
     * @param month
     * @param day
     */
    public static void queryOneDay(Table table, String phone, int year, int month, int day) throws IOException {
        Scan scan = new Scan();
        // 电话号码相等  主叫相等或者被叫相等都算这个电话第一条通话记录
        Filter filter1 = HBaseFilterUtil.eqFilter("info", "call1", Bytes.toBytes(phone));
        Filter filter2 = HBaseFilterUtil.eqFilter("info", "call2", Bytes.toBytes(phone));
        Filter filter12 = HBaseFilterUtil.orFilter(filter1, filter2);  // 使用或者选择器

        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day);
        String dateStr = dateFormatter.format(calendar.getTime());
        Filter filter3 = HBaseFilterUtil.subStringFilter("info", "startTime", dateStr);

        Filter filter = HBaseFilterUtil.andFilter(filter12, filter3);  // 和时间算在一起是与选择器
        scan.setFilter(filter);
        ResultScanner results = table.getScanner(scan);
        for (Result result : results) {
            System.out.println(Bytes.toString(result.getRow()));
        }
    }

    /**
     * 查找某一月
     *
     * @param table
     * @param phone
     * @param year
     * @param month
     */
    public static void queryOneMonth(Table table, String phone, int year, int month) throws IOException {

        Scan scan = new Scan();
        // 电话号码相等  主叫相等或者被叫相等都算这个电话第一条通话记录
        Filter filter1 = HBaseFilterUtil.eqFilter("info", "call1", Bytes.toBytes(phone));
        Filter filter2 = HBaseFilterUtil.eqFilter("info", "call2", Bytes.toBytes(phone));
        Filter filter12 = HBaseFilterUtil.orFilter(filter1, filter2);  // 使用或者选择器

        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM");
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1,1);
        String dateStr = dateFormatter.format(calendar.getTime());
        Filter filter3 = HBaseFilterUtil.subStringFilter("info", "startTime", dateStr);

        Filter filter = HBaseFilterUtil.andFilter(filter12, filter3);  // 和时间算在一起是与选择器
        scan.setFilter(filter);
        ResultScanner results = table.getScanner(scan);
        for (Result result : results) {
            System.out.println(Bytes.toString(result.getRow()));
        }
    }

    /**
     * 查找某一年
     *
     * @param table
     * @param phone
     * @param year
     */
    public static void queryOneYear(Table table, String phone, int year) throws IOException {
        Scan scan = new Scan();
        // 电话号码相等  主叫相等或者被叫相等都算这个电话第一条通话记录
        Filter filter1 = HBaseFilterUtil.eqFilter("info", "call1", Bytes.toBytes(phone));
        Filter filter2 = HBaseFilterUtil.eqFilter("info", "call2", Bytes.toBytes(phone));
        Filter filter12 = HBaseFilterUtil.orFilter(filter1, filter2);  // 使用或者选择器

        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        String dateStr = dateFormatter.format(calendar.getTime());
        Filter filter3 = HBaseFilterUtil.subStringFilter("info", "startTime", dateStr);

        Filter filter = HBaseFilterUtil.andFilter(filter12, filter3);  // 和时间算在一起是与选择器
        scan.setFilter(filter);
        ResultScanner results = table.getScanner(scan);
        for (Result result : results) {
            System.out.println(Bytes.toString(result.getRow()));
        }

    }

    /**
     * 查询从一个时间段到另外一个时间段的通话记录
     *
     * @param phone
     * @param beginTime  开始月份  例如:2018-03
     * @param endTime 结束月份  例如:2019-02
     */
    public static void queryBeginEnd(String phone, String beginTime, String endTime) throws IOException {
        Table table = HBaseUtil.getTable(PropertyUtil.getProperty("hbase.table.name"));
        Scan scan = new Scan();
        // 电话号码相等  主叫相等或者被叫相等都算这个电话第一条通话记录
        Filter filter1 = HBaseFilterUtil.eqFilter("info", "call1", Bytes.toBytes(phone));
        Filter filter2 = HBaseFilterUtil.eqFilter("info", "call2", Bytes.toBytes(phone));
        Filter filter12 = HBaseFilterUtil.orFilter(filter1, filter2);  // 使用或者选择器

        Filter filter3 = HBaseFilterUtil.gtFilter("info", "startTime", Bytes.toBytes(beginTime));
        Filter filter4 = HBaseFilterUtil.ltFilter("info", "startTime", Bytes.toBytes(endTime));
        Filter filter = HBaseFilterUtil.andFilter(filter12, filter3, filter4);

        scan.setFilter(filter);
        ResultScanner results = table.getScanner(scan);
        for (Result result : results) {
            System.out.println(Bytes.toString(result.getRow()));
        }
    }

}
Copyright © 尚硅谷大数据 2019 all right reserved,powered by Gitbook
该文件最后修订时间: 2019-01-14 05:27:28

results matching ""

    No results matching ""