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:聚合查询结果的类型转换不当的主要内容,如果未能解决你的问题,请参考以下文章

Linq标准查询操作符

有没有更简洁的方法将查询结果转换为类型?

为啥在两个类型转换字段上连接的 Access 查询中会出现“#Error”的结果?

在union的时候怎么强制指定数据类型

使用 fetchall() 时转换查询结果类型

查询Mysql表之后将结果转换为json时如何能够保持字段的原有数据类型?