导出HBase数据到Excel(Java代码)

一、主要代码

package com.sgcc.mcsas.bigdata.tool;

import com.sgcc.mcsas.bigdata.service.HBaseServiceImpl;
import com.sgcc.mcsas.bigdata.service.IHBaseService;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.client.Result;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by dwxx-120 on 2016/7/12.
 */
public class Export {

    private static IHBaseService service = new HBaseServiceImpl();
    private static final int count = 5;//记录数
    private static final String fileName = "D:/hbase_export.xls";

    public static void exportExcel(List<String> tableNames) throws Exception {
        //创建excel文件
        File file = new File(fileName);
        if (!file.exists()) {
            file.createNewFile();
        }

        //设定输出流
        FileOutputStream fos = new FileOutputStream(file);
        HSSFWorkbook book = new HSSFWorkbook();

        for (int k = 0; k < tableNames.size(); k++) {
            String tableName = tableNames.get(k);
            //取部分数据
            List<Result> results = service.getTopSomeRecords(tableName, "05M", count);

            //创建sheet
            HSSFSheet sheet = book.createSheet();
            book.setSheetName(k, tableName.replace(":", "_"));

            //为空返回
            if (results.size() == 0) {
                System.out.println(tableName + " has no data!");
                continue;
            }

            //生成表头
            HSSFRow header = sheet.createRow(0);
            HSSFCell header_rowkey = header.createCell(0);

            //rowkey表头
            header_rowkey.setCellValue("ROWKEY");
            //其他表头
            List<Cell> cells0 = results.get(0).listCells();
            for (int i = 0; i < cells0.size(); i++) {
                HSSFCell header_other = header.createCell(i + 1);
                String name = new String(cells0.get(i).getQualifier());
                header_other.setCellValue(name);
            }

            //遍历查询的数据
            for (int i = 0; i < results.size(); i++) {
                //一个Result创建一行
                HSSFRow data_row = sheet.createRow(i + 1);
                Result r = results.get(i);

                //设置rowkey的值
                String rowkey = new String(r.getRow());
                HSSFCell data_rowkey = data_row.createCell(0);
                data_rowkey.setCellValue(rowkey);

                //设置其他值
                List<Cell> cellList = r.listCells();
                for (int j = 0; j < cellList.size(); j++) {
                    HSSFCell data_other = data_row.createCell(j + 1);
                    data_other.setCellValue(new String(cellList.get(j).getValue()));
                }
            }
        }
        //写入
        book.write(fos);
    }

    public static void main(String args[]) throws Exception {
        //HBase表名
        List<String> list = new ArrayList<String>();
        list.add("mcsas:zxjc_aeolianvibration");
        list.add("mcsas:zxjc_airmoisture");
        list.add("mcsas:zxjc_airpresure");
        list.add("mcsas:zxjc_brakecable");
        list.add("mcsas:zxjc_chargeelectricity");
        list.add("mcsas:zxjc_electromotorstate");
        list.add("mcsas:zxjc_gasinoil");
        list.add("mcsas:zxjc_gispartdischarge");
        list.add("mcsas:zxjc_icethickness");
        list.add("mcsas:zxjc_ideoimage");
        list.add("mcsas:zxjc_ironcoreelectricity");
        list.add("mcsas:zxjc_lightningrod");
        list.add("mcsas:zxjc_linegalloping");
        list.add("mcsas:zxjc_linesag");
        list.add("mcsas:zxjc_linetemperature");
        list.add("mcsas:zxjc_oillevel");
        list.add("mcsas:zxjc_partdischarge");
        list.add("mcsas:zxjc_pollutiondegree");
        list.add("mcsas:zxjc_spectrum");
        list.add("mcsas:zxjc_substationweather");
        list.add("mcsas:zxjc_tinywater");
        list.add("mcsas:zxjc_topoiltemperature");
        list.add("mcsas:zxjc_towerinclination");
        list.add("mcsas:zxjc_weather");
        list.add("mcsas:zxjc_windageyaw");

        exportExcel(list);
    }
}

二、HBase取数据主要代码(getTopSomeRecords)

/**
     * 获取指定位置向下N条记录
     */
    public List<Result> getTopSomeRecords(String tableName, String startRow,
                                           Integer count) throws HBaseException {
        Connection connection = null;
        Table hTable = null;
        try {
            connection = ConnectionFactory.createConnection(conf);
            hTable = connection.getTable(TableName.valueOf(tableName));
            Scan scan = new Scan();
            List<Result> results = new ArrayList<Result>();

            scan.setCacheBlocks(true);
            scan.setCaching(10000);
            scan.setStartRow(Bytes.toBytes(startRow));

            PageFilter filter = new PageFilter(count);
            scan.setFilter(filter);

            ResultScanner scanner = hTable.getScanner(scan);

            for (Result r : scanner) {
                results.add(r);
            }

            scanner.close();
            return results;
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("获取数据出错: ", e);
            throw new HBaseException(HBaseException.UNKNOW_ERROR, "获取数据出错: ", e);
        } finally {
            closeHTable(hTable);
            closeConn(connection);
        }
    }

三、备注

1、本文中一个表对应一个sheet,最终只有一个Excel文件,里面含有多个sheet

2、本文只是取部分数据,将数据先存入List中,如果数据量太大,会导致内存溢出,另外Excel也不可能存放太多的数据,建议只取部分数据

时间: 2024-10-11 13:25:16

导出HBase数据到Excel(Java代码)的相关文章

使用poi导出大量数据到excel遇到的问题

最近在工作遇到利用poi导出大量数据到excel并提供下载的运用场景,并遇到了一个问题,当数据量过大时(几十万),后台在进行数据写入excel中的过程会非常耗时,导致迟迟没有响应前台,结果数据还没导完,前台页面就已经崩掉了. 解决思路:接收到前台导出excel请求之后,开一个线程,在线程里进行数据的写入和将写入完成的excel保存到服务器中等耗时操作,前台定时发送ajax请求检测是否已经导出完成,如果完成则提供一个下载链接到前台供用户下载. 想到解决思路之后,自己写了一个小demo,顺便学习下利

POI 导出大批量数据的Excel

POI作为操作Excel的三方库应用广泛,本文着重讨论导出大批量数据的Excel的处理,版本为4.1.0: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> 使用HSSFWorkbook进行导出,示例代码如下,代码中导出5万行20列的

winform导出dataviewgrid数据为excel的方法

本文实例讲述了winform导出dataviewgrid数据为excel的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: #region 导出dataViewGrid视图中的数据为xls格式 private void btnExportList_Click(object sender, EventArgs e) { string fname = string.Empty; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter =

.NET使用Office Open XML导出大量数据到 Excel

我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EXCEL,但不久前,我在一个项目碰到一个需求:要将几个分别有近60多万的数据源导出到Excel中,我们先不要讨论这个需求本身是否合理,客户就是要这样.我先后用NPOI和EPPlus,都发现同一个问题:OutOfMemoryException,我电脑12G内存居然不够用? 的确内存溢出了,但内存还剩下好

PHP导出MySQL数据到Excel文件

PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件. ? 1 <br><!--?php// 输出Excel文件头,可把user.csv换成你要的文件名header('Content-Type: application/vnd.ms-excel');he

poi 导出Excel java代码

js: 1 function initBatchExport(url,sub_key,current_sub_num){ 2 var btn_id="#btn_char"+current_sub_num; 3 if(Number(current_sub_num)==1){ 4 btn_id="#btn_char"; 5 } 6 // 查询条件 7 //var paramObj=new Object(); 8 //var result_Data ={}; 9 mont

extjs4 前台导出grid数据 生成excel,数据量大后台无法接收到数据

最近做的一个web项目使用的是extsj4 框架,需要一个导出excel功能,通过extjs4 自带的导出方法实现.在前台生成excel的代码,form提交传递到后台输出.前台grid数据超过1000行后导出数据后台无法接收.网上搜索了很多是tomcat传输数据大小默认为2m导致的,将tomcat的server.xml中的 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20

导出数据库数据制成Excel和txt

引用ICSharpCode.SharpZipLib.dll 1.编写压缩和解压代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ICShaepCode.SharpZipLib; using ICShaepCode.SharpZipLib.Zip; using ICShaepCode.SharpZip

C#WinForm 直接导出DataGridView数据到Excel表格的二种方法对比

方法一.利用微软的excel 操作类 引用:using Excel = Microsoft.Office.Interop.Excel; 代码如下:         #region导出数据表:Excle (微软的excel 操作类)         ///<summary>         ///导出数据表:Excle         ///</summary>         ///<param name="myDGV"></param>