Как сделать внешнюю таблицу для Oracle NoSQL - PullRequest
0 голосов
/ 29 апреля 2019

Я постараюсь сделать это кратким и простым, поскольку сам процесс создания таблицы не тривиален, но моя конкретная проблема заключается в следующем.

Итак, я создал две директории в моей базе данных Oracle 12c;а также таблица, которая будет внешней таблицей для моей базы данных Oracle NoSQL, где все мои данные хранятся в виде пар ключ-значение.

Это пример одного из многих реестров, которые у меня есть:

1007 * / TweeterStream / - / 1120615850967351298 eyJjcmVhdGVkX2F0IjoiVHVlIEFwciAyMyAwOToxMDoxMyArMDAwMCAyMDE5IiwiaWQiOjExMjA2MTU4NTA5NjczNTEyOTgsImlkX3N0ciI6IjExMjA2MTU4NTA5NjczNTEyOTgiLCJ0ZXh0IjoiUlQgQG1uX2VudGE6IFx1OTk5OVx1NTNkNlx1NjE0ZVx1NTQzZVx1MzAwMVx1NjBiMlx1MzA1N1x1MzA3Zlx1MzA2OFx1NzJjMlx1NmMxN1x1MzA2ZVx1NmYxNFx1NjI4MCEgXHU3NjdkXHU3N2YzXHU1NDhjXHU1ZjRjXHU3NmUz ....

И так далее.Значение сокращается, чтобы сделать сообщение коротким и точным.Если вы выполните процесс создания внешней таблицы, вы достигнете точки, в которой используется Formatter.Этот класс Formatter отвечает за чтение значения и отображение нужных данных во внешней таблице.Мой Formatter выглядит следующим образом:

public class TweetFormatter implements Formatter {

public TweetFormatter() {
    super();
}

public String toOracleLoaderFormat(final KeyValueVersion kvv, final KVStore kvStore){

    final Key key = kvv.getKey();
    final Value value = kvv.getValue();

    //Filtrar Clave
    List<String> major = key.getMajorPath();

    Tweet tw = null;

    String valor_retorno="";

    BufferedWriter bf = FormatterUtils.getInstance().getWriter();

    try {
        FormatterUtils.getInstance().writeLine(bf,"Check 0:\n Key length is: "+major.size()
        + "\n Values are: "+major.toString() + "\n contains: "+major.contains("TweeterStream"));

        FormatterUtils.getInstance().writeLine(bf,"Check 1:\n Key is: "+key);

        Boolean contains = false;

        for(String x : major) {
            if(x=="TweeterStream") {
                contains = true;
                break;
            }
        }

        FormatterUtils.getInstance().writeLine(bf, "Contains: " + contains);

        //Parsear
        if(contains){
            //String data = Base64.getDecoder().decode(value.getValue()).toString();
            String data = new String(Base64.getDecoder().decode(value.getValue()));
            FormatterUtils.getInstance().writeLine(bf,"Check 2. \nValue is: "+data+"\nCon length: "+data.length());

            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

            tw = objectMapper.readValue(data, Tweet.class);

            FormatterUtils.getInstance().writeLine(bf,"Check 3 - El formatter retorna:\n"+tw.toString());
            valor_retorno = tw.toString();
        }else{
            valor_retorno = null;
        }

    }  catch (Exception e) {
        e.printStackTrace();
        FormatterUtils.getInstance().writeLine(bf, "Peta Chavalin.. :(");
    } finally {
        FormatterUtils.getInstance().generateLog(bf);
    }
    return tw != null ? valor_retorno : null;
}

Как вы видите, я фильтрую в этом Formatter то, что содержит ключ, поэтому я продолжаю анализировать только с Джексоном значения, ключ которых состоит из "TweeterStream".

Проблема в том, что процесс идет нормально!Файл конфигурации, используемый в KVStore (NoSQL), публикуется в 12c DB;и файл nosql.dat также генерируется.Затем, используя сгенерированный скрипт, Formatter вызывается для каждого реестра, и команда выполняется без ошибок, НО она никогда не обрабатывает реестры, начинающиеся с "TweeterStream", которые являются единственными, которые мне нужны.

Я оставляю копию файла logFormatter.txt, который я генерирую на случай, если он вам поможет:

Проверка 0: Длина ключа: 3 Значения: [t, streamz,? 0009] содержит: false Проверка 1: Ключ: / t / streamz /? 0009 Содержит: false

Почему программа не достигает «Контрольной точки 2»?Почему он не распознает регистры, начинающиеся с "TweeterStream"?Если кто-нибудь может дать мне знать, как такое поведение возможно даже без решения проблемы, это все равно будет здорово.У меня нет идей.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...