由于表格的实际制作过程并不容易,因此我将尽量简化和简单,但我的具体问题是。
因此,我在Oracle 12c数据库中创建了两个目录。还有一个表,它将成为我的Oracle NoSQL数据库的外部表,其中所有数据都存储为键值对。
这是我拥有的许多注册表之一的示例:
/ TweeterStream /-/ 1120615850967351298 eyJjcmVhdGVkX2F0IjoiVHVlIEFwciAyMyAwOToxMDoxMyArMDAwMCAyMDE5IiwiaWQiOjExMjA2MTU4NTA5NjczNTEyOTgsImlkX3N0ciI6IjExMjA2MTU4NTA5NjczNTEyOTgiLCJ0ZXh0IjoiUlQgQG1uX2VudGE6IFx1OTk5OVx1NTNkNlx1NjE0ZVx1NTQzZVx1MzAwMVx1NjBiMlx1MzA1N1x1MzA3Zlx1MzA2OFx1NzJjMlx1NmMxN1x1MzA2ZVx1NmYxNFx1NjI4MCEgXHU3NjdkXHU3N2YzXHU1NDhjXHU1ZjRjXHU3NmUz ....
以此类推。缩短值以使帖子简短而切合实际。如果按照该过程制作外部表,则将达到使用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中过滤了密钥包含的内容,因此我仅继续与Jackson解析其密钥由“ TweeterStream”组成的值。
问题在于过程进行得很顺利! KVStore(NoSQL)中使用的配置文件已发布在12c DB中。并且还会生成文件nosql.dat。然后,使用生成的脚本,为每个注册表调用Formatter,并且该命令执行没有错误,但是它永远不会处理我唯一需要的以“ TweeterStream”开头的注册表。
我留下了我生成的logFormatter.txt的副本,以防它对您有帮助:
检查0: 密钥长度是:3 值是:[t,streamz,?0009] 包含:假 检查1: 关键是:/ t / streamz /?0009 包含:false
为什么程序没有到达“检查点2”?它为什么不识别以“ TweeterStream”开头的寄存器?如果任何人都可以让我知道即使不解决问题也可能发生这种情况,那仍然很好。我没主意了。
谢谢