KDB:聚合查询结果的类型转换不当
Posted
技术标签:
【中文标题】KDB:聚合查询结果的类型转换不当【英文标题】:KDB : Inappropriate type casting for aggregation query result 【发布时间】:2016-04-14 04:05:46 【问题描述】:我在 KDB 中运行以下查询来创建表结构并在其中插入数据:-
n:1000000;item:`apple`banana`orange`pear;city:`beijing`chicago`london`paris;tab:([]time:asc n?0D0;n?item;amount:n?100;n?city);
发布后,我运行了一个 Java 程序来使用聚合进行选择查询。代码如下:-
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.logging.Level;
import java.util.logging.Logger;
import kx.c;
public class Aggregate
public static class KxTableModel
private c.Flip flip;
public void setFlip(c.Flip data)
this.flip = data;
public int getRowCount()
return Array.getLength(flip.y[0]);
public int getColumnCount()
return flip.y.length;
public Object getValueAt(int rowIndex, int columnIndex)
return c.at(flip.y[columnIndex], rowIndex);
public String getColumnName(int columnIndex)
return flip.x[columnIndex];
;
public static void main(String[] args)
KxTableModel model = new KxTableModel();
c c = null;
try
c = new c("localhost", 5001,":");
String query="select sum amount by city from tab";
// String query="0!select last price by sym from trade where date=last date";
model.setFlip((c.Flip) c.k(query));
catch (Exception ex)
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
finally
if (c != null) tryc.close(); catch (IOException ex)
System.out.println(model.getRowCount());
System.out.println(model.getValueAt(1, 1));
上面的代码在执行后给了我以下错误:-
Apr 14, 2016 9:30:10 AM Aggregate main
SEVERE: null
java.lang.ClassCastException: kx.c$Dict cannot be cast to kx.c$Flip
at Aggregate.main(Aggregate.java:40)
Exception in thread "main" java.lang.NullPointerException
at Aggregate$KxTableModel.getRowCount(Aggregate.java:17)
at Aggregate.main(Aggregate.java:47)
【问题讨论】:
【参考方案1】:您的查询返回一个键控表(因为by city
)
您现在可以处理 c.Dict
或在您的选择之前插入 0!
以取消表格的键。
0!select sum amount by city from tab
【讨论】:
谢谢hellomichibye。那行得通。但是如何使用 Java 处理 KDB 中的键控表而不取消键控呢?我的意思是,还有其他方法吗? final Object res = c.k(query);if (res instanceof c.Dict) final c.Dict dict = (c.Dict) res; if ((dict.x instanceof c.Flip) && (dict.y instanceof c.Flip)) final c.Flip key = (c.Flip) dict.x;最终 c.Flip 数据 = (c.Flip) dict.y; // 做点什么 【参考方案2】:我遇到了同样的错误,当我检查连接详细信息时,我发现我正在查询错误的服务器。确保您连接到正确的服务器。
【讨论】:
以上是关于KDB:聚合查询结果的类型转换不当的主要内容,如果未能解决你的问题,请参考以下文章