2013-04-04 61 views
1

我目前正在使用python3訪問HBase。我正在做的方式是使用py4j調用我正在寫入的訪問HBase的JAVA API。py4j:字典到JAVA地圖

我有一個問題涉及創建一個Put對象,它需要一個限定符和值。

我想將一個字典傳遞給需要hashmap的JAVA類。是否有可能通過py4j。

我不想調用Put爲每個列限定符迭代。我想將字典傳遞給py4j,它應該在JAVA端作爲HashMap接收。

請你一些提示/指針,如何才能做到這一點?

回答

1

有兩種方法可以做到你想要什麼:

  1. 你可以在Python端create a java.util.HashMap() and use it as a dict。如果你經常使用這個字典,這很好,但是你不會經常在python方面修改它。如果在java端修改了字典,並且希望在python端查看修改,這也很好。
  2. 當調用Java方法時,Py4J可以automatically convert a python dict to a HashMap。請注意,字典將被複制,並且在Java端執行的任何更改都不會反映在Python端。

最簡單的解決辦法是#1我相信:

>>> m = gateway.jvm.java.util.HashMap() 
>>> m["a"] = 0 
>>> m.put("b",1) 
>>> m 
{u'a': 0, u'b': 1} 
>>> u"b" in m 
True 
>>> del(m["a"]) 
>>> m 
{u'b': 1} 
>>> m["c"] = 2 
+0

確實喜歡'M每條語句[ 「一」] = 0'通過socket發送一些數據?我beileve它確實。 100次修改將發送100個套接字請求。或者我的理解錯了?我想要創建Python中的100個項目的字典,並將它發送給JAVA以獲得任何:)。我認爲第二種方法對這種情況更有效。這是我的理解。請讓我知道,如果它不正確或我錯過了一些東西... – Mayank 2013-04-04 13:39:38

+0

事實上,第二種解決方案是您在評論中描述的用法的最佳選擇。你說得對,第一個解決方案中,100個任務將通過套接字導致100次交換。 – Barthelemy 2013-04-04 17:32:54

+0

最後一個問題。是否有可能從返回NavigableMap 的JAVA函數中獲取字典。字節可以是一個HashMap 遞歸...我想我應該去simplejson。你有什麼建議:) – Mayank 2013-04-04 19:24:18