Я постараюсь сделать это кратким и простым, поскольку сам процесс создания таблицы не тривиален, но моя конкретная проблема заключается в следующем.
Итак, я создал две директории в моей базе данных 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"?Если кто-нибудь может дать мне знать, как такое поведение возможно даже без решения проблемы, это все равно будет здорово.У меня нет идей.
Спасибо