其他常见问题解答
Q1: Java API 如何构造一个 DolphinDB 中的字典类型?目前已知的方式是通过 run 方法执行脚本拿到字典类型的返回值来构建,请问有其他更加直接方便的实现方式吗?
A1: 实例化的时候需要设定好 key 和 value 的类型,比如 key 是 DT_INT,value 是 DT_STRING,之后调用 put 方法插入 k-v 对,代码如下:
BasicDictionary dictionary = new BasicDictionary(Entity.DATA_TYPE.DT_INT, Entity.DATA_TYPE.DT_STRING); dictionary.put(new BasicInt(1),new BasicString("IBM")); System.out.println(dictionary.getString());
Q2: 表是别人建的,我只知道表名,想获取表中对应的字段和类型,所以想用 columnNames 函数看下,但是使用 columnNames 参数却需要构建一个表。
A2: 如果只知道表名的情况下,可以先使用 loadTable 函数获取 table:
List<Entity> arguments1 = new ArrayList<Entity>(1); BasicTable table1 = (BasicTable) conn.run("loadTable('dfs://testDatabase','pt')"); arguments1.add(table1); BasicStringVector o1 = (BasicStringVector)conn.run("columnNames",arguments1); System.out.println(o1.getString());
Q3: Java API 构造 BasicDateVector / BasicTimeVector 需要传入 int 列表,如何将日期或时间转换为 int 类型?
A3: 可以参考如下代码:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmssSSS"); Utils.countDays(LocalDate.parse(currentDate, dateFormatter)) Utils.countMilliseconds(LocalTime.parse(String.format("%09d", Integer.parseInt(localCurrentTime)), timeFormatter))
Q4: Java API 执行 tableInsert 方法后,可以获取成功插入的条数吗?
这里打印 entity.rows 没有得到成功插入的条数:
Entity entity = conn.run("tableInsert(...)")
System.out.println(entity.rows())
A4: 在 Java API 中,执行 tableInsert 的返回值 entity 是 BasicInt 类型,直接打印 entity 即可看到成功插入的记录数。
Q5: Java API 在订阅流表后可以读出数据,但是读完后不断抛出 EOFException,重连后也是如此:
Successfully reconnected and subscribed xxxx:8903/DemoStreamjavaStreamingApi java.io.EOFException at com.xxdb.io.AbstractExtendedDataInputStream.readUnsignedByte(AbstractExtendedDataInputStream.java:116) at com.xxdb.io.AbstractExtendedDataInputStream.readBoolean(AbstractExtendedDataInputStream.java:21) at com.xxdb.streaming.client.MessageParser.run(MessageParser.java:68) at java.lang.Thread.run(Thread.java:748)
A5: 多线程共用一个 session,会导致 buffer 序列化失败,进而导致此报错。