前文(Ambari-server开发自定义api)提到ambari-server自定义api,来获取一个表的信息。html
如今有一个需求,就是制做一个api,获取两个表的信息。这两个表中的数据是经过一个字段值是否一致来判断是否关联在一块儿的。java
下文会根据每一个方法的做用进行说明,没有ambari-server后台开发的经验看起来可能会有些吃力,建议仍是多debug后台代码,该文仅做参考。node
下面以ambari数据表
racks
和hosts
表为例,制做的一条get类型的api,其中根据racks表中的rack_name字段值和hosts表中的rack_info字段值判断数据是否关联。git
<!--more-->github
其中requestedSubResources的值是在对应Type的ResourceDefinition类中定义,例如RackResourceDefinition.javaapache
对应的RackHostResourceDefinition.javajson
这样的话,requestedSubResources就有值了centos
获取的另外一个表中的数据api
这里面最重要的就是两个for循环,由两个for循环来判断子资源是否内嵌到父资源内微信
TreeNode<Resource> childResult = subResource.getResult(resource).getResultTree();
QueryResult queryResult = queryResults.get(parentResource);
这里获得结果的queryResponse就是子数据了
会根据ClusterControllerImpl.getNextResource()来获取下一个资源,若是这里判断为null,进而判断为false,则不会进入for循环,进而会退出二次迭代,而后子数据就没有了。这也是多表数据关联的最重要的一步。
是在**QueryImpl.getResult()**里面进行操做的。要特别注意。
ClusterControllerImpl.getNextResource() ---> .evaluate() ---> org.apache.ambari.server.controller.predicate.**EqualsPredicate.evaluate()**来做判断。
这两个的keyPropertyIds须要对比,必须只有Resource.Type.Rack
相同,不然predicate
的值就会有变化,进而致使两个表的数据没法进行关联匹配。
org/apache/ambari/server/controller/internal/RackResourceProvider.java
org/apache/ambari/server/controller/internal/RackHostResourceProvider.java
请求方式:http://ip:8080/api/v1/racks?fields=rack_hosts
请求类型:GET
{ href: "http://ip:8080/api/v1/racks?fields=rack_hosts", items: [ { href: "http://ip:8080/api/v1/racks/%2Frack1", rack: { rack_description: "", rack_height: "42", rack_id: 1, rack_location: "", rack_name: "/rack1", rack_type: "Defalut" }, rack_hosts: [ { href: "http://ip:8080/api/v1/racks/%2Frack1/rack_hosts/node1.ambari", Host: { cpu_count: 2, disk_info: [ { available: "40661924", device: "/dev/sda3", used: "80735412", percent: "67%", size: "121397336", type: "xfs", mountpoint: "/" } ], host_height: "2", host_location: "41", host_name: "node1.ambari", host_status: "HEALTHY", host_type: "default", ip: "ip", maintenance_state: "OFF", os_type: "centos7", ph_cpu_count: 2, public_host_name: "node1.ambari", rack_info: "/rack1", total_mem: 7994320 } } ] }, { href: "http://ip:8080/api/v1/racks/%2Frack2", rack: { rack_description: "", rack_height: "42", rack_id: 2, rack_location: "", rack_name: "/rack2", rack_type: "Defalut" }, rack_hosts: [ ] } ] }
其中rack字段是一个表的数据,rack_hosts字段又是另外一个表的数据。
好了各位,以上就是这篇文章的所有内容了,能看到这里的人呀,都是 人才。
白嫖很差,创做不易。 各位的支持和承认,就是我创做的最大动力,咱们下篇文章见!
若是本篇博客有任何错误,请批评指教,不胜感激 !
本文来自: 微信公众号【大数据实战演练】。阅读更多精彩好文,欢迎关注微信公众号【大数据实战演练】。