精华内容
下载资源
问答
  • HDFS常见javaAPI操作

    千次阅读 2018-05-13 20:41:52
    * 总结了HDFS的常见javaAPI操作,包括: * 1.创建文件夹 * 2.删除文件夹 * 3.创建文件 * 4.上传文件 * 5.下载文件 * 6.使用seek命令多次重定位操作 * 7.多线程(并发)写入多个文件 * 8.文件的追加 * 9.多...
    /**
     * 总结了HDFS的常见javaAPI操作,包括:
     * 1.创建文件夹
     * 2.删除文件夹
     * 3.创建文件
     * 4.上传文件
     * 5.下载文件
     * 6.使用seek命令多次重定位操作
     * 7.多线程(并发)写入多个文件
     * 8.文件的追加
     * 9.多线程追加入单个文件;注:这种方式无法实现,示例中列出了错误原因
     * 10.不同字符集文件的上传
     * 11.hdfs内部文件拷贝
     * @author SHCH
     *
     */
    public class HDFS_Demo1 {
    	public static void main(String[] args) throws Exception {
    		
    		
    	}
    	/**
    	 * hdfs文件的内部拷贝,类似hdfs shell的distcp命令
    	 * 但注意,只是拷贝文件
    	 * 目前还没找到内部拷贝文件夹的api
    	 * 
    	 * @throws IOException
    	 */
    	private static void innerHDFSFileCopy() throws IOException {
    		String path="hdfs://192.168.80.132:9000";
    		FileSystem fs=FileSystem.get(URI.create(path),new Configuration());
    		FSDataInputStream fdis = fs.open(new Path("/one/bb.xml"));
    		FSDataOutputStream fdos = fs.create(new Path("/one/cc.xml"));
    		//HDFS自身的拷贝
    		IOUtils.copyBytes(fdis, fdos, 1024, true);
    	}
    
    	/**
    	 * 修改hdfs-site.xml,添加property,dfs.support.append并设置为true,可以实现文件的追加(hadoop1不支持),
    	 * 
    	 * 
    	 * 下面这个方法会出错,如下:
    	 * because DFSClient_NONMAPREDUCE_1373065962_11 is already the current lease holder.
    	 * 意思是说多个并发线程不能写入同一个文件
    	 * 
    	 * 注:此时文件有可能已经写入数据,但数据中只是一个线程写入的内容!!!
    	 */
    	private static void multiThreadWriteSingleFile() {
    		class MyRunnable implements Runnable {
    			private int idx;
    
    			public MyRunnable(int... idx) {
    				if (idx.length > 0)
    					this.idx = idx[0];
    			}
    			FileSystem fs = null;
    			@Override
    			public void run() {
    				try {
    					fs = FileSystem.get(URI.create("hdfs://192.168.80.132:9000"), new Configuration());
    					FSDataOutputStream fdos = fs.append(new Path("/one/appendfile"));
    					for (int k = 0; k < 5; k++) {
    						for (int i = 0; i < 5; i++) {
    							fdos.write(Thread.currentThread().getName().getBytes());
    							fdos.write(" ".getBytes());
    						}
    						fdos.write("\n".getBytes());
    						//不知道有啥用......
    						fdos.sync();
    						Thread.currentThread().sleep(100);// 让其它綫程执行一下
    					}
    					IOUtils.closeStream(fdos);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		;
    		// 启动三个线程
    		for (int i = 0; i < 3; i++) {
    			new Thread(new MyRunnable()).start();
    		}
    	}
    
    	/**
    	 * 开启多个线程写入不同文件
    	 * 
    	 */
    	private static void multiThreadputData() {
    		class MyRunnable implements Runnable {
    			private int idx;
    
    			public MyRunnable(int idx) {
    				this.idx = idx;
    			}
    
    			FileSystem fs = null;
    
    			@Override
    			public void run() {
    				try {
    					fs = FileSystem.get(URI.create("hdfs://192.168.80.132:9000"), new Configuration());
    					FSDataOutputStream fdos = fs.create(new Path("/one/file" + idx));
    					// 写五行
    					for (int k = 0; k < 5; k++) {
    						// 每行写五个单词
    						for (int i = 0; i < 5; i++) {
    							// 写入5个字符一组,模拟英文单词
    							for (int j = 0; j < 5; j++) {
    								char ch = "abcdefghijklmnopqrstuvwxyz".charAt(new Random().nextInt(26));
    								fdos.write(ch);
    							}
    							fdos.write(" ".getBytes());
    						}
    						fdos.write("\n".getBytes());
    						// 让其它程序执行一下
    						Thread.currentThread().sleep(100);
    					}
    					IOUtils.closeStream(fdos);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		;
    		// 启动三个线程
    		for (int i = 0; i < 3; i++) {
    			new Thread(new MyRunnable(i + 1)).start();
    		}
    	}
    
    	/**
    	 * 由于本地(中文版windows)文件是gbk格式,因此,按照gbk读取,但centos默认字符集是utf8,要解决字符集问题,需要按照utf8格式输出
    	 * 
    	 * @throws IOException
    	 * @throws FileNotFoundException
    	 * @throws UnsupportedEncodingException
    	 */
    	private static void putDataWithCharSet() throws IOException, FileNotFoundException, UnsupportedEncodingException {
    		FileSystem fs = FileSystem.get(URI.create("hdfs://192.168.80.132:9000"), new Configuration());
    		FileInputStream fis = new FileInputStream(new File("d:/test.txt"));
    		FSDataOutputStream fdos = fs.create(new Path("/one/test2.txt"));
    		byte[] b = new byte[1024];
    		int len = 0;
    		while ((len = fis.read(b)) != -1) {
    			// 由于本地(中文版windows)文件是gbk格式,因此,按照gbk读取,但centos默认字符集是utf8,要解决字符集问题,需要按照utf8格式输出
    			fdos.writeUTF(new String(b, 0, len, "gbk"));
    		}
    		// IOUtils.copyBytes(fis, fdos, 1024, true);
    		IOUtils.closeStream(fdos);
    		fis.close();
    	}
    
    	/**
    	 * 如果路径是一个目录,则列出给定路径中文件/目录的状态。 注:必须是一个目录,如果列出跟目录下的,需要加“/”
    	 * 
    	 * @throws IOException
    	 * @throws FileNotFoundException
    	 */
    	private static void listStatus() throws IOException, FileNotFoundException {
    		// 注意:path最后必须有路径“/”(或具体的文件夹)
    		String path = "hdfs://192.168.80.132:9000/";
    		FileSystem fs = FileSystem.get(URI.create(path), new Configuration());
    		FileStatus[] statuss = fs.listStatus(new Path(path));
    		for (FileStatus s : statuss) {
    			// 大体与listFiles相似,此处简单一些
    			// 另外:包含的还有文件夹的信息
    			System.out.println(s.getPath().toString());
    		}
    	}
    
    	/**
    	 * 列出给定路径中文件的状态和块位置。如果路径是一个目录,如果recursive 是false的,则返回目录中的文件;如果recursive
    	 * 是true的,那么在子树中返回的文件根在路径上。如果路径是一个文件,返回文件的状态和块位置。 注:
    	 * 1.listFiles包含块信息,liststatus则没有 2.只获取文件的信息,而没有文件夹的信息
    	 * 
    	 * @throws IOException
    	 * @throws FileNotFoundException
    	 */
    	private static void listFiles() throws IOException, FileNotFoundException {
    		String path = "hdfs://192.168.80.132:9000";
    		FileSystem fs = FileSystem.get(URI.create(path), new Configuration());
    		RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"), true);
    		while (files.hasNext()) {
    			LocatedFileStatus status = files.next();
    			String pathname = status.getPath().toString();
    			boolean type = status.isDirectory();
    			BlockLocation[] blockLocations = status.getBlockLocations();
    			long blockSize = status.getBlockSize();
    			FsPermission permission = status.getPermission();
    			System.out.println(pathname);
    			System.out.println("\t文件类型" + (type == true ? "文件夹" : "文件"));
    			System.out.println("\t块位置");
    			for (int i = 0; i < blockLocations.length; i++) {
    				System.out.println("\t\t" + blockLocations[i].toString());
    			}
    			System.out.println("\t块大小:" + blockSize);
    			System.out.println("\t权限:" + permission.toString());
    			/*
    			 * status的其它方法 isDirectory isFile getBlockSize getBlockLocations获取块位置
    			 * 
    			 */
    		}
    	}
    
    	/**
    	 * 从HDFS上获取数据,同时使用seek方法重新定位
    	 * 
    	 * @throws IOException
    	 */
    	private static void getDataUseSeek() throws IOException {
    		String path = "hdfs://192.168.80.132:9000";
    		String file = "/testfile";
    		FSDataInputStream fdis = null;
    		FileSystem fs = FileSystem.get(URI.create(path), new Configuration());
    		try {
    			Path f = new Path(file);
    			// 可以通过fs的isFile或isDirectory方法获得file的类型
    			if (!fs.isFile(f)) {
    				System.out.println("要下載的文件是文件夹,只能下载文件!");
    				return;
    			}
    			fdis = fs.open(new Path(file));
    			byte[] b = new byte[1024];
    			int len = 0;
    			System.out.println("第一次打印:");
    			while ((len = fdis.read(b)) != -1) {
    				String res = new String(b, 0, len);
    				System.out.println(res);
    			}
    			System.out.println("第二次打印:");
    			// FSDataInputStream实现了Seekable接口,因此可以通过seek方法重新定位到字节数据的任意位置,还有一个skip方法,尽可以向前定位
    			fdis.seek(0);
    			while ((len = fdis.read(b)) != -1) {
    				String res = new String(b, 0, len);
    				System.out.println(res);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			IOUtils.closeStream(fdis);
    		}
    	}
    
    	/**
    	 * 从hdfs获取数据,类似shell的get命令
    	 * 
    	 * @throws IOException
    	 */
    	private static void getData() throws IOException {
    		String path = "hdfs://192.168.80.132:9000/";
    		String file = "/testfile";
    		String localFile = "d:/b.txt";
    		FileSystem fs = FileSystem.get(URI.create(path), new Configuration());
    		FSDataInputStream fdis = null;
    		FileOutputStream fos = null;
    		try {
    			fdis = fs.open(new Path(path));
    			fos = new FileOutputStream(new File(localFile));
    			IOUtils.copyBytes(fdis, fos, 1024, false);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			IOUtils.closeStream(fdis);
    			if (fos != null)
    				fos.close();
    		}
    	}
    
    	/**
    	 * 。 像hdfs上传数据,类似shell的put命令
    	 * 
    	 * @throws IOException
    	 */
    	private static void putData() throws IOException {
    		String path = "hdfs://192.168.80.132:9000/";
    		String file = "/testfile";
    		String localFile = "d:/a.txt";
    		FileSystem fs = FileSystem.get(URI.create(path), new Configuration());
    		FSDataOutputStream dos = null;
    		FileInputStream fis = null;
    		try {
    			// 通过fs的create方法获取像hdfs发送数据的FSDataOutputStream
    			dos = fs.create(new Path(file));
    			fis = new FileInputStream(new File(localFile));
    			IOUtils.copyBytes(fis, dos, 1024, false);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			IOUtils.closeStream(dos);
    			if (fis != null)
    				fis.close();
    		}
    	}
    
    	private static void removeDir() throws IOException, URISyntaxException {
    		String path = "hdfs://192.168.80.132:9000/"; // 用以创建URI对象
    		String dir = "/three";
    		FileSystem fs = FileSystem.get(URI.create(path), new Configuration());
    		boolean delete = fs.delete(new Path(dir), true);
    		if (delete) {
    			System.out.println("删除一个文件夹" + dir);
    		}
    	}
    
    	/**
    	 * 使用hadoop API创建一个文件夹 注意区分两个路径,传入get方法的是URI对象;mkdir方法传入的是Path对象
    	 * 
    	 * @throws IOException
    	 * @throws URISyntaxException
    	 */
    	private static void createDir() throws IOException, URISyntaxException {
    		String path = "hdfs://192.168.80.132:9000/"; // 用以创建URI对象
    		String dir = "/three";// 用于组建Path对象
    		FileSystem fs = FileSystem.get(new URI(path), new Configuration());// 使用默认的配置,
    		boolean mkdirs = fs.mkdirs(new Path(dir));
    		if (mkdirs) {
    			System.out.println("创建一个文件夹" + dir);
    		}
    		// fs.close();
    	}
    
    	/**
    	 * 使用纯java方式访问hdfs
    	 * 
    	 * 这种方式功能较弱,最好的方式使用Hadoop提供的API来访问
    	 */
    	private static void getHDFSFileWithOutHadoopAPI() throws MalformedURLException, IOException {
    		String path = "hdfs://192.168.80.132:9000/users/testfiles/CreateTestFile.py";
    		URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    		URL url = new URL(path);
    		InputStream is = url.openStream();
    		IOUtils.copyBytes(is, System.out, 1024, true);
    	}
    }
    

    展开全文
  • elasticsearch 常见查询及聚合的JAVA API

    万次阅读 多人点赞 2018-07-19 17:40:35
     ES 常见查询 根据ID 进行单个查询 GetResponse response = client.prepareGet("accounts", "person", "1") .setOperationThreaded(false) .get(); 相对于sql 的 select * .....

    最近在研究ES 有点心得记录下备忘

     ES 常见查询

    • 根据ID 进行单个查询
      GetResponse response = client.prepareGet("accounts", "person", "1")
                      .setOperationThreaded(false)
                      .get();

      相对于sql 的 select * from accounts.person  where id=1 ;

    • 分页查询所有记录

      QueryBuilder qb=new MatchAllQueryBuilder();
              SearchResponse response= client.prepareSearch("accounts").setTypes("person").setQuery(qb).setFrom(0)
                      .setSize(100).get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }
      response.getHits()是所有命中记录  相较于sql select * from accounts.person limit 100;
    • 根据多条件组合与查询
       QueryBuilder qb=QueryBuilders.boolQuery().must(QueryBuilders.termQuery("title","JAVA开发工程师")).must(QueryBuilders.termQuery("age",30)) ;
      
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(qb).setFrom(0)
                      .setSize(100);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }

      must 就像sql里的and   相较于sql  select * from accounts.person where title='JAVA开发工程师' and age=30

    • 多条件或查询

       QueryBuilder qb=QueryBuilders.termQuery("user","kimchy14");
              QueryBuilder qb1=QueryBuilders.termQuery("user","kimchy15");
      
              SortBuilder sortBuilder=SortBuilders.fieldSort("age");
              sortBuilder.order(SortOrder.DESC);
              QueryBuilder s=QueryBuilders.boolQuery().should(qb).should(qb1);//.must(qb5);
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).addSort(sortBuilder).setFrom(0)
                      .setSize(100);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }
          

      should 就像sql里的or  SortBuilder 的作用不言而喻就是用来排序 以上代码相较于sql  select * from   accounts.person where user='kimchy14' or  user='kimchy15'   ;       

    • 范围查询 

      // RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(30,true);
             // RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gt(30 );
              RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(30 );
              QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFrom(0)
                      .setSize(100);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }

      范围查询rangeQuery.from(30,true)方法是大于30  后面的参数是是否包含 为true的话就是大于等于30 to就相当于小于 如果也有包含参数为true的话就是小于等于  gt 是大于 gte是大于等于   lt是小于 lte是小于等于  第一句的builder就相当于 select * from accounts.person where age >=30 and age<=30;              

    • 包含查询

       List<String> strs=new ArrayList<>();
              strs.add("kimchy14");
              strs.add("kimchy15");
              strs.add("kimchy16");
              QueryBuilder qb=QueryBuilders.termsQuery("user",strs);
      
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(qb).setFetchSource("age",null).setFrom(0)
                      .setSize(100);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }

      包含查询使用termsQuery 可以传列表 也可以传多个参数 或者数组 setFetchSource有两个参数 第一个参数是包含哪些参数 第二个参数是排除哪些参数   以上这段代码就相当于sql  select age from accounts.person where user in ('kimchy14','kimchy15','kimchy16');

    • 专门按id进行的包含查询

      QueryBuilder qb=QueryBuilders.idsQuery(0+"");
      
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(qb).setFetchSource("age",null).setFrom(0)
                      .setSize(100);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits(); 
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }

       

    • 按通配符查询

        QueryBuilder qb = QueryBuilders.wildcardQuery("user", "k*hy17*");
               //Fuzziness fuzziness=Fuzziness.fromEdits(2);
      
            // QueryBuilder qb = QueryBuilders.fuzzyQuery("user","mchy2").fuzziness(fuzziness);
              //QueryBuilder qb = QueryBuilders.prefixQuery("user", "kimchy2");
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(qb).setFetchSource("user",null).setFrom(0)
                      .setSize(100);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }

      通配符查询像我们sql里的like 但是还不一样 like的百分号可以加到前后    elasticsearch技术解析与实战中有一句话 是这么说的 为了避免极端缓慢的通配符查询 通配符索引词不应该以一个通配符开头 通配符查询应该避免以通配符开头  谢谢androidtoutou的指正

     

      常见统计  统计分为指标 和 桶 桶就是我们统计的样本  指标就是我们平时所查的count  sum  与sql不一样的是 我们还可以将统计的样本拿到 就是response.getHits

    • 统计count
      AggregationBuilder  termsBuilder = AggregationBuilders.count("ageCount").field("age");
      
              RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(30,true);
              QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFrom(0).setSize(100).addAggregation(termsBuilder);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }
              ValueCount valueCount= response.getAggregations().get("ageCount");
              long value=valueCount.getValue();

      这段代码就相当于 sql select count(age) ageCount form accounts.person  where age >=30 and age<=30   

    • 查询最大值

       AggregationBuilder  termsBuilder = AggregationBuilders.max("max").field("age");
      
              RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(30,true);
              QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFrom(0).setSize(100).addAggregation(termsBuilder);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }
              Max valueCount= response.getAggregations().get("max");
              double value=valueCount.getValue();
               

       

    • 统计总和

       AggregationBuilder  termsBuilder = AggregationBuilders.sum("sum").field("age");
      
              RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(30,true);
              QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFrom(0).setSize(100).addAggregation(termsBuilder);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }
              Sum valueCount= response.getAggregations().get("sum");
              double value=valueCount.getValue();

       

    • 平均数

       AggregationBuilder  termsBuilder = AggregationBuilders.avg("avg").field("age");
      
              RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(30,true);
              QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFrom(0).setSize(100).addAggregation(termsBuilder);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }
              Avg valueCount= response.getAggregations().get("avg");
              double value=valueCount.getValue();

       

    • 统计样本基本指标

              AggregationBuilder  termsBuilder = AggregationBuilders.stats("stats").field("age");
      
              RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(30,true);
              QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
              SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFrom(0).setSize(100).addAggregation(termsBuilder);
              logger.log(Level.INFO,sv.toString());
              SearchResponse response=  sv.get();
              SearchHits searchHits =  response.getHits();
              for(SearchHit hit:searchHits.getHits()){
                  logger.log(Level.INFO , hit.getSourceAsString());
              }
              Stats valueCount= response.getAggregations().get("stats");
              logger.log(Level.INFO,"max"+valueCount.getMaxAsString());
              logger.log(Level.INFO,"avg"+valueCount.getAvgAsString());
              logger.log(Level.INFO,"sum"+valueCount.getSumAsString());
              logger.log(Level.INFO,"min"+valueCount.getMinAsString());
              logger.log(Level.INFO,"count"+valueCount.getCount());

      分组统计 相当于group by 后拿各组指标进行统计 

     分组求各组数据

     AggregationBuilder  termsBuilder = AggregationBuilders.terms("by_age").field("age");
            AggregationBuilder  sumBuilder=AggregationBuilders.sum("ageSum").field("age");
            AggregationBuilder  avgBuilder=AggregationBuilders.avg("ageAvg").field("age");
            AggregationBuilder  countBuilder=AggregationBuilders.count("ageCount").field("age");
    
            termsBuilder.subAggregation(sumBuilder).subAggregation(avgBuilder).subAggregation(countBuilder);
            //TermsAggregationBuilder all = AggregationBuilders.terms("age").field("age");
            //all.subAggregation(termsBuilder);
            RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(36,true);
            QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
            SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(s).setFetchSource(null,"gender").setFrom(0).setSize(100).addAggregation(termsBuilder);
            logger.log(Level.INFO,sv.toString());
            SearchResponse response=  sv.get();
    
            Aggregations terms= response.getAggregations();
            for (Aggregation a:terms){
                LongTerms teamSum= (LongTerms)a;
                for(LongTerms.Bucket bucket:teamSum.getBuckets()){
                    logger.info(bucket.getKeyAsString()+"   "+bucket.getDocCount()+"    "+((Sum)bucket.getAggregations().asMap().get("ageSum")).getValue()+"    "+((Avg)bucket.getAggregations().asMap().get("ageAvg")).getValue()+"    "+((ValueCount)bucket.getAggregations().asMap().get("ageCount")).getValue());
    
                }
            }

    第一行 termsBuilder 就相当于根据年龄对数据进行分组 group by   后面对sumBuilder avgBuilder countBuilder等就是在组内 求和 求平均数 求数量

     多分组求各组数据

    
            TermsAggregationBuilder all = AggregationBuilders.terms("by_gender").field("gender");
             AggregationBuilder age = AggregationBuilders.terms("by_age").field("age");
            AggregationBuilder  sumBuilder=AggregationBuilders.sum("ageSum").field("age");
            //AggregationBuilder  avgBuilder=AggregationBuilders.avg("ageAvg").field("age");
           // AggregationBuilder  countBuilder=AggregationBuilders.count("ageCount").field("age");
             all.subAggregation(age.subAggregation(sumBuilder));
            RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(30,true).to(32,true);
            QueryBuilder s=QueryBuilders.boolQuery().must(rangeQueryBuilder);//.must(qb5);
            SearchRequestBuilder sv=client.prepareSearch("accounts").setTypes("person").setQuery(rangeQueryBuilder).addAggregation(all);
            logger.log(Level.INFO,sv.toString());
            SearchResponse response=  sv.get();
    
            Aggregations terms= response.getAggregations();
            for (Aggregation a:terms){
                StringTerms stringTerms= (StringTerms)a;
                 for(StringTerms.Bucket bucket:stringTerms.getBuckets()){
                  //  logger.info(bucket.getKeyAsString());
                    Aggregation aggs=bucket.getAggregations().getAsMap().get("by_age");
                     LongTerms terms1= (LongTerms)aggs;
                    for (LongTerms.Bucket bu:terms1.getBuckets()){
                         logger.info(bucket.getKeyAsString()+"  "+bu.getKeyAsString()+" "+bu.getDocCount()+"    "+((Sum)bu.getAggregations().asMap().get("ageSum")).getValue());
                    }
    
                }
            }

    每增加一个分组指标就需要多加一个termsBuilder  其他等一切跟普通分组一样 每次拿到

          

              以上就是我总结的基本的查询 聚合 等常见功能 其他等诸如 求各组前多少数据是用topHits 这些基本够我们日常操作了 。

              最后我们总结下    精确查询用term 组合查询用bool 范围用range    and查询用must    or查询用should  not查询用must not  常见的接收聚合返回结果的类型 ValueCount   AVG  SUM  MAX  MIN  按照英文意义就可以理解  分组聚合查询时候还需要根据实际情况看是返回那种terms 

     

     

    展开全文
  • JavaAPI文档

    千次阅读 2019-10-20 21:31:24
    Java API文档 Scanner类 引用类型的一般使用步骤: 1.导包 import 路径.类名称; 如果要使用的目标类,和当前类位于同一个下,可以省略导报语句不写。 只有java.lang 下的内容不需要导包,其他的都...

    Java API文档

    Scanner类

    引用类型的一般使用步骤:
    1.导包
    import 包路径.类名称;
    如果要使用的目标类,和当前类位于同一个包下,可以省略导报语句不写。
    只有java.lang 包下的内容不需要导包,其他的包都需要import语句。

    2.创建
    类名称 对象名 = new 类名称();
    Scanner sc = new Scanner (System.in);
    3.使用
    对象名.成员方法名()

    获取键盘输入的一个int数字: int num = sc.nextInt();
    获取键盘输入的一个字符串: String str = sc.next();

    匿名对象

    创建对象的标准格式:
    类名称 对象名 = new 类名称();
    匿名对象就是只有右边对象,没有左边的名字和赋值运算符。
    new 类名称();
    注意:匿名对象只能使用一次。
    eg. new Person().name = “江疏影”;

    Random类

    1.导包
    import java.util.Random;
    2.创建
    Random r = new Random(); //小括号中可以留空即可
    3.使用
    1.获取一个随机的int数字(范围是int所有范围,有正负两种): int num = r.nextInt();
    2.获取一个随机的int数字(参数代表了范围,左闭右开区间): int num = r.nextInt(3);
    实际上代表含义是:[0,3) ,也就是0~2
    在这里插入图片描述
    ArrayList类
    数组的长度不可以发生改变。
    但是,ArrayList集合的长度是可以随意变化的。
    对于Array List来说,有一个尖括号代表泛型。
    泛型:也就是装在集合中的所有元素,全部都是统一的类型。
    注意事项:对于ArrayList集合来说,直接打印得到的不是地址值而是内容。如果内容为空,得到的是空的中括号[ ];
    在这里插入图片描述
    ArrayList 当中常用的方法

    public boolean add (E,e):向集合中添加元素,参数的类型和泛型一致。返回值代表添加是否成功。

    public E get(int index) : 从集合中获取元素,参数是索引编号,返回值就是对应元素位置。

    public E remove(int index) : 从集合中删除元素,参数是索引编号,返回值就是被删除掉的元素。

    public int size() : 获取集合的尺寸长度,返回值是集合中包含的元素个数。
    在这里插入图片描述

    static类

    静态代码块的格式是:
    public class 类名称{
    static {
    // 静态代码块的内容
    }
    }
    特点:当第一次用到本类时,静态代码块执行唯一的一次。
    静态内容总是优先于非静态,所以静态代码块比构造方法先执行。
    静态代码块的典型用途:
    用来一次性对静态成员变量赋值。

    静态static关键字修饰的成员方法:
    一旦使用static修饰成员方法,那么这就成为了静态方法,静态方法不属于对象,而是属于类。
    如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
    如果有static关键字,那么不需要创建对象,直接就能通过类名称来使用它。

    无论是成员变量还是成员方法,如果有了static方法都推荐使用类名称进行调用。
    静态变量:类名称.静态变量
    静态方法: 类名称.静态方法();
    注意:
    1.静态(先)不能直接访问非静态(后)
    “先人不知后人,后人之先人”
    2.静态方法中不能用this

    Arrays类
    java.util.Arrays 是一个与数组相关的工具类,里面提供了大量的静态方法,来实现数组的常见操作。
    public static String toString(数组):将参数数组变成字符串(按照默认格式:[元素1,元素2,元素3…]
    public static void sort(数组):按照默认升序(从小到大)对数组的元素进行排序。

    Math类
    java.util.Math类是数学想的工具类

    public static double abs(double num):获取绝对值,有多种重载
    public static double ceil(double num):向上取整
    public static double floor(double num):向下取整
    public staticlong round(double num):四舍五入
    Math.PI代表π。

    Object类

    toString方法

    java.lang.Object类
    Person p = new Person("张三",18);
    String s = p.toString();
    System.out.println(s); //打印出地址值 
    

    直接打印对象的地址值没有意义,需要重写Object类中的toString方法,打印对象的属性(name,age);

    class Person{
    	@Override
    	public String toString(){
    	return "Person{"+
    				"name"+name+"\"+",age="
    

    equals方法

    展开全文
  • JAVA API下几个常用的

    千次阅读 2012-01-10 14:46:37
    API  常见的几个类:lang/util/io/math/net awt --------  用于创建用户界面和绘制图形的所有类。 util ------  包含 collection 框架、遗留的 collection 类、事件模型、日期和时间...

     

    API
     常见的几个类:lang/util/io/math/net

    awt --------
            用于创建用户界面和绘制图形的所有类。

    util ------ 
    包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类                                   (字符串标记生成器、随机数生成器和位数组)。
    net-------
            为实现网络应用程序提供类

    lang------
            为java编程提供基础类

    io  --------
            通过数据流、序列化和文件系统,提供系统的输入和输出。

    math ------
            提供用于任意精度整数算法和任意精度小数算法的类

     Java 开发工具集(Java Development Kit),是 JDK的缩写;
    API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
    展开全文
  • 之前我们对hdfs的操作主要是通过在linux命令行里进行的,而在实际的应用中,为了实现本地与HDFS 的文件传输,我们主要借助于eclipse的开发环境开发的javaAPI来实现对远程HDFS的文件创建,上传,下载和删除等操作 ...
  • JAVA+ 微服务客户端写的一些查询,最近一直在研究ELK,对于 elasticsearch是特别感兴趣,并且是用得最多的,现在总结一下一些相关的 CURD语句,帮助我们快速完成一些常用数据分板等。 1 连接客户端的方式 有x-...
  • java常见api+++

    千次阅读 2019-07-16 19:00:05
    java学习日志day14 2019年7月16日 replaceAll 将字符串的某种元素,全部替换为指定的元素; 格式 str.replaceAll("\d","*") 对字符串中的数字排序; 把非数字字符替换; String str = “465asd45679asd12ads...
  • 新手小白学JAVA API Object String StringBuffer/StringBuilder

    万次阅读 多人点赞 2021-05-15 21:48:43
    亲爱的小伙伴萌,目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢? 其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~ 2 什么是API API(Application ...
  • java api文档的阅读技巧

    万次阅读 多人点赞 2012-09-23 09:09:12
    javaapi文档的阅读技巧:  JavaAPI文档是SDK说明文件的一部分,是具体告诉你上述内容的使用方法的文档,是Java程序开发的最好帮手。当你从Sun Microsystems公司的网站...
  • java常见包的说明

    2017-04-09 10:27:14
    1. java.lang 该提供了java编程的基础类,例如:Object、Math、String、StringBuffer、System、Thread等、不使用该的话就很难编写java代码了 2. java.util:该提供了包含集合框架、一流的集合类、时间模型...
  • kafka的JavaAPI操作

    千次阅读 2020-04-09 13:44:00
    一、创建maven工程并添加jar 创建maven工程并添加以下依赖jar的坐标到pom.xml <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --> <dependency>...
  • Java API文档的阅读技巧

    万次阅读 2017-12-01 12:04:28
    2、java api文档再使用的时候,尽量少的使用搜索,而是通过目录寻找,这样可以帮助你熟悉目标类所在的具体位置 3、左侧蓝色的比较大的是名,下面?列出来的是下面的类和接口。和继承没有关系,同一个包中...
  • Java String中常见API

    千次阅读 2019-07-26 11:42:08
    我们知道,通常情况下,windows系统的文件路径格式如:D:\file\test.java这样的形式,那么,我们应当如何获取到文件名称呢? 下面这种办法十分高效: public static String getFileName2 ( String path ) { ...
  • Github Mybatis深入学习之Java API

    千次阅读 2013-11-10 01:37:35
    了解Mybatis的Java API对编写将Mybatis为持久化框架的Java程序很有帮助,尤其是对于数据库操作方面以及SqlSession的管理方面很重要。  原文地址:http://mybatis.github.io/mybatis-3/java-api.html  现在,你知道...
  • ElasticSearch java API - 聚合查询

    万次阅读 2016-09-20 17:20:15
    Elastic Search Java API 各种聚合(Aggregation)查询的实现
  • // import 名.类名; import java.util.Scanner;
  • Kafka的JavaAPI操作

    千次阅读 2020-04-18 09:36:56
    创建maven工程并添加jar2. 生产者代码1. 使用生产者,生产数据2. kafka当中的数据分区3. 消费者代码1. 自动提交offset2. 手动提交offset3. 消费完每个分区之后手动提交offset4. 指定分区数据进行消费6. 高阶API...
  • Java API设计指南

    千次阅读 2007-04-07 21:43:00
    作者: Eamonn McManus 原文地址: http://www.artima.com/weblogs/viewpost.jsp?thread=142428 译者: 王磊 电子邮件: wl_95421@yahoo.com.cn (该译文可以随便...可能要用汗牛充椟来形容,但是想找到一本如何设计API
  • 阅读目录HDFS Java API一、创建项目 :example-hdfs二、修改pom.xml文件三、创建类TestHDFSClient.java四、创建文件五、下载文件六、上传文件七、其他常见的操作(这里不做演示了)八、FileSystem类常用方法九、遇到...
  • zookeeper 基本命令和java api

    万次阅读 2018-06-11 17:16:15
    2.java API的使用 首先需要在maven添加zookeeper的jar <groupId>org.apache.zookeeper <artifactId>zookeeper <version>3.4.10 具体代码如下: public class ZookeeperDemo { /** 服务地址,...
  • // Java对应的API操作的端口都是9300,记住是9300 new InetSocketTransportAddress(InetAddress.getByName("192.168.100.211"), 9300), new InetSocketTransportAddress(InetAddress.getByName("192.168.100.212...
  • Java常见

    千次阅读 2018-12-18 16:45:17
    目录 JDK自带的 第三方包 JDK自带的 JAVA提供了强大的应用程序接口,既JAVA类库。他包含大量已经设计好的工具类,帮助...java.applet:java.applet是用来实现运行于Internet浏览器中的JAVA APPLET的工具...
  • 快速入门Kafka系列(6)——Kafka的JavaAPI操作

    千次阅读 多人点赞 2020-03-22 11:55:49
    作为快速入门Kafka系列的第六篇博客,本篇为大家带来的是Kafka的JavaAPI操作~         码字不易,先赞后看! 文章目录Kafka的JavaAPI操作1. 创建Maven工程并添加jar2. ...
  • elastic search实战小demo:... 之前在 Elastic Search之Search API(Query DSL)、Elasticsearch之索引和文档API 文章中讲到过elastic search(以下简称es)的以下常用的原生api,本篇开始讲述如...
  • HDFS常用的Java Api详解

    万次阅读 2016-03-13 20:20:23
    一、使用Hadoop URL读取数据 ...import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.hadoop.io.IOUtils; public class URL
  • 算法竞赛中的常用JAVA API :HashMap 和 TreeMap

    千次阅读 多人点赞 2020-01-25 22:10:08
    了解其他JAVA 常用API和算法点这里 >> https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍Map接口下的HashMap和TreeMap。 HashMap HashMap是基于哈希表的 Map 接口的实现,是 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 190,219
精华内容 76,087
关键字:

常见javaapi包

java 订阅