2016-07-14 3 views
0

Я строю топологию Trident, которая запрашивает HBaseState. Я использую пакет org.apache.storm.hbase.Storm-HBase Trident - Query Несколько столбцов одновременно

Мое понимание (исправьте меня, если я ошибаюсь) заключается в том, что HBaseQuery считывает все значения столбцов (или те, которые указаны в projectionCriteria) для данного rowKey, и выводит каждый столбец отдельно с помощью полей ("columnName", "columnValue") ,

Например, если у меня был стол с домашними животными, а rowKey - имя домашнего животного и столбец для «type» и столбец «age», stateQuery получит входной кортеж со значениями («Fido») и будет выводить два отдельные кортежи с:

Values ​​("Fido", "Тип", "Собака")

значения ("Fido", "Возраст", 11)

Некоторые вопросы:

  1. Есть ли способ получить значения из нескольких столбцов в одном запросе? Смысл, могу ли я получить один вывод с полями («Имя», «column1Value», «column2Value»)?

  2. Если есть способ получить значения из нескольких столбцов в один кортеж, можно ли это сделать, если они имеют разные типы (например, один является строковым, является целым)?

В конце концов, моя цель состоит в том, чтобы иметь возможность принимать входные кортежи с полями («Name») и получить Одновыходовой кортежи с полями («Name», «Тип», «Возраст»), например Values («Фидо», «Собака», 11) и «Значения» («Мистер Киблем», «Кошка», 4). Если это невозможно, используя вышеизложенное, как это возможно?

TIA за помощь!

ответ

1

Я решил проблему сам, размещая здесь для потомков:

Причина у меня были трудности, потому что я строила прочь WordCountValueMapper без фактического понимания того, как она используется. Немного более глубокое копание в классе результатов помогло.

Вот как я его реализации в настоящее время:

public static class MyValueMapper implements HBaseValueMapper { 
    @Override 
    public List<Values> toValues(ITuple tuple, Result result) throws Exception { 
    List<Values> values = new ArrayList<Values>(); 
    Cell[] cells = result.rawCells(); 

    values.add(new Values(Bytes.toString(CellUtil.cloneValue(cells[0])), Bytes.toInt(CellUtil.cloneValue(cells[1])))); 
    return values; 
    } 
    @Override 
    public void declareOutputFields(OutputFieldsDeclarer declarer) { 
    declarer.declare(new Fields("type","age")); 
    } 
} 

В WordCountValueMapper, они итерацию через каждую клетку в результате, что эквивалентно переборе каждого столбца. Вместо этого я взял весь массив ячеек и вытащил значения. Ничего особенного, я этого раньше не понимал.