Неверные результаты из HBase Bytes.toString (byte [] b) в Jython - PullRequest
0 голосов
/ 25 февраля 2012

Интересно, что я здесь делаю неправильно. Использование Jython 2.2.1 на Java 1.5 с Hbase 0.90. Не удается заставить Bytes.toString (byte [] b) работать. Он возвращает то, что выглядит как адрес. Но когда я использую перегруженный Bytes.toString (byte [] b, int off, int len) , он возвращает правильный результат.

g = Get(Bytes.toBytes(id))
res = self.table.get(g)

t = res.getValue(Bytes.toBytes('stuff'), Bytes.toBytes('t'))
print Bytes.toString(t)              // returns stuff like '[B@12121212'
print Bytes.toString(t, 0, len(t))   // returns the string properly

Кто-нибудь видел это раньше?

Ответы [ 2 ]

2 голосов
/ 24 декабря 2016

Вы не делаете ничего плохого.Я использую Jython 2.7 на Java 1.8 и HBase 1.2.4 и сталкиваюсь с тем же поведением.Вот что, по-видимому, происходит: Java поддерживает несколько методов с одним и тем же именем, которые принимают разные наборы параметров, и, таким образом, Jython внутренне вынужден устранять неоднозначность между несколькими методами с одним и тем же именем, которые принимают разные параметры.Массив Byte [], который преобразуется в строку, представляется в виде массива Python или некоторого его подкласса, который имеет метод toString (), который принимает один параметр (self).Объект 'Bytes', являющийся его подклассом, имеет метод Python для array.toString (self) и Java .toString (final [] byte b) и .toString (final [] byte b, int off, int len) методов.

Должно случиться так, что способ создания объекта Bytes приводит к тому, что .toString (self) Python заменяет Java .toString (final [] byte b) в Java, но другой метод все еще работает, потому что Python отсутствуетМетод .toString () с тремя параметрами для замены другого Java .toString ().(См. https://docs.python.org/2.7/library/array.html?highlight=tostring#array.array.tostring)

Решение: Исправленный импорт с несколькими дополнительными строками кода исправляет это.

import org.apache.hadoop.hbase.util.Bytes as BrokenBytes
class Bytes(BrokenBytes):
    @staticmethod
    def toString( x ): return( BrokenBytes.toString( x, 0, len( x ) ) )
0 голосов
/ 25 февраля 2012

Не возможно.В том, что вы делаете, должно быть что-то большее, чем то, что вы опубликовали.Первая перегрузка toString вызывает вторую.Вот исходный код (из HBase 0.90.3):

  /**
   * @param b Presumed UTF-8 encoded byte array.
   * @return String made from <code>b</code>
   */
  public static String toString(final byte [] b) {
    if (b == null) {
      return null;
    }
    return toString(b, 0, b.length);
  }

  /* snip */

  /**
   * This method will convert utf8 encoded bytes into a string. If
   * an UnsupportedEncodingException occurs, this method will eat it
   * and return null instead.
   *
   * @param b Presumed UTF-8 encoded byte array.
   * @param off offset into array
   * @param len length of utf-8 sequence
   * @return String made from <code>b</code> or null
   */
  public static String toString(final byte [] b, int off, int len) {
    if (b == null) {
      return null;
    }
    if (len == 0) {
      return "";
    }
    try {
      return new String(b, off, len, HConstants.UTF8_ENCODING);
    } catch (UnsupportedEncodingException e) {
      LOG.error("UTF-8 not supported?", e);
      return null;
    }
  }
...