如何创建Oracle NoSQL的外部表

时间:2019-04-29 10:13:30

标签: java oracle oracle12c external-tables oracle-nosql

由于表格的实际制作过程并不容易,因此我将尽量简化和简单,但我的具体问题是。

因此,我在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”开头的寄存器?如果任何人都可以让我知道即使不解决问题也可能发生这种情况,那仍然很好。我没主意了。

谢谢

0 个答案:

没有答案