前文(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字段又是另外一個表的數據。
好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是 人才。
白嫖很差,創做不易。 各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!
若是本篇博客有任何錯誤,請批評指教,不勝感激 !
本文來自: 微信公衆號【大數據實戰演練】。閱讀更多精彩好文,歡迎關注微信公衆號【大數據實戰演練】。