2013-04-04 6 views
1

В настоящее время я работаю над доступом к HBase с помощью python3. Способ, которым я занимаюсь, заключается в использовании py4j для вызова API JAVA, которые я пишу для доступа к HBase.py4j: dict to JAVA map

У меня возник вопрос, связанный с созданием объекта Put, который принимает квалификатор и значение.

Я хочу передать словарь в класс JAVA, который ожидает hashmap. Возможно ли это через py4j.

Я не хочу итеративно переводить Put для каждого столбца. Я хочу передать dict в py4j, и он должен быть получен как HashMap на стороне JAVA.

Не могли бы вы некоторые намеки/указатели на то, как это можно сделать ...

ответ

1

Есть два способа сделать то, что вы хотите:

  1. Вы можете create a java.util.HashMap() and use it as a dict на стороне питона. Это хорошо, если вы много переходите в словарь, но часто не изменяете его на стороне python. Это также хорошо, если словарь изменен на стороне java и вы хотите увидеть изменения на стороне python.
  2. Py4J может использовать automatically convert a python dict to a HashMap при вызове метода Java. Обратите внимание, что словарь будет скопирован и что любые изменения, выполненные на стороне 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

делает каждое высказывание как 'т [ "а"] = 0 'посылает некоторые данные через сокет? Я понимаю, что это так. 100 изменений отправят 100 запросов сокетов. Или мое понимание не так? Я хочу создать словарь из 100 элементов в python и отправить его в JAVA для чего угодно :). Я думаю, что второй метод более эффективен для такого случая. Это то, что я понимаю. Пожалуйста, дайте мне знать, если это неверно, или мне что-то не хватает ... – Mayank

+0

Действительно, второе решение является лучшим для использования, которое вы описываете в своем комментарии. Вы правы, что при первом решении 100 назначений приведут к 100 обмену через сокет. – Barthelemy

+0

Последний вопрос. Можно ли получить словарь из функции JAVA, которая возвращает NavigableMap . Байты могут быть HashMap рекурсивно ... Думаю, я должен пойти на simplejson. Что вы предлагаете :) – Mayank