【问题标题】:py4j: dict to JAVA mappy4j:字典到 JAVA 映射
【发布时间】:2013-04-04 09:56:38
【问题描述】:

我目前正在使用 python3 访问 HBase。我正在做的方式是使用 py4j 调用我正在编写的 JAVA API 来访问 HBase。

我有一个与创建带有限定符和值的 Put 对象有关的问题。

我想将字典传递给需要哈希图的 JAVA 类。是否可以通过py4j。

我不想为每个列限定符迭代地调用 Put。我想将 dict 传递给 py4j,它应该在 JAVA 端作为 HashMap 接收。

能否请您提供一些提示/指示如何做到这一点...

【问题讨论】:

    标签: java python python-3.x py4j


    【解决方案1】:

    有两种方法可以做你想做的事:

    1. 你可以在 python 端create a java.util.HashMap() and use it as a dict。如果你通过字典很多,这很好,但你不经常在 python 端修改它。如果在 java 端修改了字典,而你想在 python 端看到修改,这也很好。
    2. Py4J 在调用 Java 方法时可以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 
    

    【讨论】:

    • m["a"] = 0这样的语句是否通过套接字发送一些数据?我相信确实如此。 100 次修改将发送 100 个套接字请求。还是我的理解有误?我想在 python 中创建包含 100 个项目的字典并将其发送到 JAVA 以获取任何内容:)。我认为第二种方法对于这种情况更有效。这就是我的理解。请让我知道它是否不正确或我遗漏了什么......
    • 确实,第二种解决方案最适合您在评论中描述的用法。你是对的,第一个解决方案,100 次分配将导致 100 次通过套接字交换。
    • 最后一个问题。是否可以从返回 NavigableMap 的 JAVA 函数中获取字典。字节可以是 HashMap 递归......我想我应该选择 simplejson。你有什么建议:)
    • 不确定那个,但是 Py4J 提供了一个基于 Map 接口的 dict 接口(它不绑定到 HashMap)。如果您使用的是字节数组,您应该使用 git 的最新版本,因为自上次发布以来,字节数组的转换修复了许多错误。
    • @Barthelemy 非常感谢 py4j。我有一个问题,我从java端调用一个带有地图列表的python函数。如果我想为参数 java 映射(py4j.java_collections.JavaMap)之一设置一个新值(数组,narray),我会收到一个错误:'numpy.ndarray' 对象没有属性'_get_object_id'。任何想法?甚至有没有像python dict的演员表一样的东西?因为普通的字典我没有任何问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2010-12-31
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多