ES查询百万数据,分批写入CSV

bom头信息要在把文件写到服务器中之前添加; 

 要不用微软的excel 打开 含汉字会乱码;

 /**
     * 滚动输出,首先要构造第一行的属性名称,然后滚动写入其他数据
     * 对于csv,每行的数据与数据之间用“,”间隔
     */
    @Test
    public void scroll() throws IOException {
        int size = 10000;  //设置每次滚动输出条数
        //创建文件存放路径
        String path = this.getClass().getResource("/").getPath()+"download/";
        File file = new File(path);
        if(!file.exists()){
            file.mkdirs();
        }
        String fileName = "scrollOutputTest.csv";
        FileWriter fw = new FileWriter(path+fileName);

//微软的excel文件需要通过文件头的bom来识别编码,所以写文件时,需要先写入bom头
        byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
        fw.write(new String(uft8bom));

        long startTime = System.currentTimeMillis();    //获取开始时间
        SearchResponse response = client.prepareSearch("twitter").setTypes("tweet")
                .addSort(SortBuilders.fieldSort("_doc"))
                .setSize(size).setScroll(new TimeValue(2000)).execute()
                .actionGet();
        //获取总数量
        long totalCount = response.getHits().getTotalHits();
        int page = (int) totalCount / size;
        System.out.println("totalCount:" + totalCount);

        String fields = getFields(response);
        //添加字段名称
        fw.write(fields);
        scrollOutputToCsv(response,fw);

        for (int i = 0; i < page-1; i++) {
            //再次发送请求,并使用上次搜索结果的ScrollId
            response = client.prepareSearchScroll(response.getScrollId())
                    .setScroll(new TimeValue(20000)).execute()
                    .actionGet();
            scrollOutputToCsv(response,fw);
        }
        fw.close();
        long endTime = System.currentTimeMillis();    //获取结束时间
        System.out.println("运行时间:"+(endTime-startTime)+"ms");
    }
//获取所有字段
    public String getFields(SearchResponse response){
        String fields = "";
        if(response.getHits().getTotalHits() !=0){
            Map<String,Object> map = response.getHits().getAt(0).getSourceAsMap();
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String key = entry.getKey();
                fields += key+",";
            }
        }
        return fields.substring(0,fields.length()-1);
    }
    public static void scrollOutputToCsv(SearchResponse response,FileWriter fw) throws IOException {
        String values;
        for(int i = 0;i<response.getHits().getHits().length;i++){
            values = "";
            Map<String,Object> map = response.getHits().getAt(i).getSourceAsMap();
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String value = entry.getValue().toString();
                values += value+",";
            }
            values = "\r\n"+values.substring(0,values.length()-1);
            fw.write(values);
        }
        fw.flush();
    }

 下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,C知道在这里,我可以帮助您解决Elasticsearch数据无法写入的问题。以下是一些可能的原因和解决方法: 1. 确认索引是否存在:在写入数据之前,确保您要写入的索引已经存在。如果不存在,您可以使用Elasticsearch的索引API来创建索引。 2. 检查集群健康状态:使用Elasticsearch的健康检查API(/_cluster/health)来确认集群的健康状态。如果集群处于黄色或红色状态,可能会导致数据写入失败。您可以根据返回的错误信息来诊断和解决问题。 3. 检查文档ID:在写入数据时,确保指定了唯一的文档ID。如果指定的文档ID已经存在,将会更新该文档而不是创建新的文档。如果没有指定文档ID,Elasticsearch将自动生成一个唯一的ID。 4. 检查索引设置:确保您的索引设置允许写入操作。您可以使用Elasticsearch的索引设置API(/_settings)来检查和修改索引的设置。 5. 检查文档映射:确保您的索引映射允许写入操作。如果映射中某个字段不允许写入,那么写入操作将会失败。您可以使用Elasticsearch的索引映射API(/_mapping)来检查和修改索引的映射。 6. 检查存储空间:确保您的Elasticsearch集群有足够的存储空间来存储新的数据。如果磁盘空间已满,写入操作将会失败。 如果您仍然遇到问题,请提供更多的信息,例如错误消息、Elasticsearch版本以及相关的配置信息,以便更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值