首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >张表向上插入导致错误:“强制转换”

张表向上插入导致错误:“强制转换”
EN

Stack Overflow用户
提问于 2017-11-17 10:14:01
回答 2查看 893关注 0票数 3

我构建了一个数据加载器原型,将CSV保存到显示表中。工作流程如下:

  1. 第一次创建模式,例如volatilitysurface表: volatilitysurface::(date:datetime$(); ccypair:symbol$() atm_convention:symbol$(); premium\_included:布尔$();smile_type:symbol$(); vs\_type:符号$();delta_ratio:float$(); delta\_setting:浮点数$();wing_extrapolation:float$(); spread\_type:符号$();
  2. 对于rawdata文件夹中的每个文件,导入它: myfiles:@[system;"dir /b /o:gn ",string $getenv[KDBRAWDATA],"*.volatilitysurface.csv 2> nul";()];if[myfiles~();.lg.o`load;“未找到挥发物面文件!”;:0n];.lg.o`load;“加载数据文件.”;/加载每个文件{mypath:“sv (string $getenv[KDBRAWDATA)];x);.lg.o`load;”加载文件名‘,mypath,"’. '“;myfile:hsym$mypath; tmp1:select date,ccypair,atm\_convention,premium\_included,smile\_type,vs\_type,delta\_ratio,delta\_setting,wing\_extrapolation,spread\_type from update date:x, premium\_included:?[premium\_included =$"true";1b;0b]从(“ZSSSSSFFFS”;登记“、”)0:我的文件;volatilitysurface upsert tmp1; } @/: myfiles; delete tmp1 from.;.Q.gc[];.lg.o`done;“加载挥发表面数据已完成”;.lg.o`save;“将挥发表面模式保存到",字符串保护;挥发表面:0!挥发表面;.lg.o`cleanup;”从内存中移除挥发表面“;删除.; .Q.gc[]; .lg.o[完成的挥发表面;”保存挥发表面已完成“;

这工作得很好。我经常使用.Q.gc[];来避免访问wsfull。当新的CSV文件可用时,我打开现有的模式,重新插入并再次保存它,有效地覆盖现有的HDB文件系统。

  1. 开放模式: .lg.o`open;“表已经存在,打开架构.”;@[system;"l ",(string afolder) _0;{.lg.e`open;“未能加载hdb目录:",x;'x}];/重新创建表索引挥发物面::dateccypair xkey从挥发物表面选择;
  2. 重新运行步骤2将新的CSV文件附加到现有的volatilitysurface表中,它完美地对第一个CSV进行了升级,但是第二个CSV失败了: 错误:` `cast

我调试到错误的程度,并再次检查,我发现tmp1volatilitysurface的元数据完全相同。知道为什么会这样吗?我在其他桌子上也有同样的问题。每次插入后,我都试过清理桌子上的钥匙,但没有帮助。

代码语言:javascript
运行
复制
volatilitysurface::0!volatilitysurface;
volatilitysurface::`date`ccypair xkey volatilitysurface;

以及在强制转换错误点上的元数据比较:

代码语言:javascript
运行
复制
meta tmp1
c                 | t f a
------------------| -----
date              | z    
ccypair           | s    
atm_convention    | s    
premium_included  | b    
smile_type        | s    
vs_type           | s    
delta_ratio       | f    
delta_setting     | f    
wing_extrapolation| f    
spread_type       | s

meta volatilitysurface
c                 | t f a
------------------| -----
date              | z    
ccypair           | s   p
atm_convention    | s    
premium_included  | b    
smile_type        | s    
vs_type           | s    
delta_ratio       | f    
delta_setting     | f    
wing_extrapolation| f    
spread_type       | s   

使用以下答案的输入来更新--我尝试像这样使用Torq的.loader.loadallfiles函数(它不会失败,但也不会发生任何事情,表不会在内存中创建,数据也不会写入数据库):

代码语言:javascript
运行
复制
.loader.loadallfiles[`headers`types`separator`tablename`dbdir`dataprocessfunc!(`x`ccypair`atm_convention`premium_included`smile_type`vs_type`delta_ratio`delta_setting`wing_extrapolation`spread_type;"ZSSSSSFFFS";enlist ",";`volatilitysurface;`:hdb; {[p;t] select date,ccypair,atm_convention,premium_included,smile_type,vs_type,delta_ratio,delta_setting,wing_extrapolation,spread_type from update date:x, premium_included:?[premium_included = `$"true";1b;0b] from t}); `:rawdata]

UDPATE2这是我从TorQ获得的输出:

代码语言:javascript
运行
复制
2017.11.20D08:46:12.550618000|wsp18497wn|dataloader|dataloader1|INF|dataloader|**** LOADING :rawdata/20171102_113420.disccurve.csv ****
2017.11.20D08:46:12.550618000|wsp18497wn|dataloader|dataloader1|INF|dataloader|reading in data chunk
2017.11.20D08:46:12.566218000|wsp18497wn|dataloader|dataloader1|INF|dataloader|Read 10000 rows
2017.11.20D08:46:12.566218000|wsp18497wn|dataloader|dataloader1|INF|dataloader|processing data
2017.11.20D08:46:12.566218000|wsp18497wn|dataloader|dataloader1|INF|dataloader|Enumerating
2017.11.20D08:46:12.566218000|wsp18497wn|dataloader|dataloader1|INF|dataloader|writing 4525 rows to :hdb/2017.09.12/volatilitysurface/
2017.11.20D08:46:12.581819000|wsp18497wn|dataloader|dataloader1|INF|dataloader|writing 4744 rows to :hdb/2017.09.13/volatilitysurface/
2017.11.20D08:46:12.659823000|wsp18497wn|dataloader|dataloader1|INF|dataloader|writing 731 rows to :hdb/2017.09.14/volatilitysurface/
2017.11.20D08:46:12.737827000|wsp18497wn|dataloader|dataloader1|INF|init|retrieving sort settings from :C:/Dev/torq//config/sort.csv
2017.11.20D08:46:12.737827000|wsp18497wn|dataloader|dataloader1|INF|sort|sorting the volatilitysurface table
2017.11.20D08:46:12.737827000|wsp18497wn|dataloader|dataloader1|INF|sorttab|No sort parameters have been specified for : volatilitysurface. Using default parameters
2017.11.20D08:46:12.737827000|wsp18497wn|dataloader|dataloader1|INF|sortfunction|sorting :hdb/2017.09.05/volatilitysurface/ by these columns : sym, time
2017.11.20D08:46:12.753428000|wsp18497wn|dataloader|dataloader1|ERR|sortfunction|failed to sort :hdb/2017.09.05/volatilitysurface/ by these columns : sym, time.  The error was: hdb/2017.09.

我得到了下面的错误,sorttab|No sort parameters have been specified for : volatilitysurface. Using default parameters,这是在哪里记录的?默认情况下,它使用表PK吗?

UPDATE3 Ok通过在my config文件夹下提供一个非默认的sort.csv来修复UPDATE2:

代码语言:javascript
运行
复制
tabname,att,column,sort
default,p,sym,1
default,,time,1
volatilitysurface,,date,1
volatilitysurface,,ccypair,1

但是现在我看到,如果在相同的文件上多次调用该函数,它只是简单地追加重复的数据,而不是upsert对其进行处理。

UPDATE4还没到..。假设我可以检查,以确保没有使用重复的文件。当我加载并启动数据库时,我会得到一些结构,它重新封装了某种字典,而不是一个表。

代码语言:javascript
运行
复制
2017.10.31| (,`volatilitysurface)!,+`date`ccypair`atm_convention`premium_incl..
2017.11.01| (,`volatilitysurface)!,+`date`ccypair`atm_convention`premium_incl..
2017.11.02| (,`volatilitysurface)!,+`date`ccypair`atm_convention`premium_incl..
2017.11.03| (,`volatilitysurface)!,+`date`ccypair`atm_convention`premium_incl..
sym       | `AUDNOK`AUDCNH`AUDJPY`AUDHKD`AUDCHF`AUDSGD`AUDCAD`AUDDKK`CADSGD`C..

注意,日期实际上是日期时间Z,而不仅仅是日期。函数调用的完整和最新版本是:

代码语言:javascript
运行
复制
target:hsym `$("" sv ("./";getenv[`KDBHDB];"/volatilitysurface"));
rawdatadir:hsym `$getenv[`KDBRAWDATA];
.loader.loadallfiles[`headers`types`separator`tablename`dbdir`partitioncol`dataprocessfunc!(`x`ccypair`atm_convention`premium_included`smile_type`vs_type`delta_ratio`delta_setting`wing_extrapolation`spread_type;"ZSSSSSFFFS";enlist ",";`volatilitysurface;target;`date;{[p;t] select date,ccypair,atm_convention,premium_included,smile_type,vs_type,delta_ratio,delta_setting,wing_extrapolation,spread_type from update date:x, premium_included:?[premium_included = `$"true";1b;0b] from t}); rawdatadir];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-17 15:08:39

我将在这里添加第二个答案,试图解决使用TorQ的数据加载器的问题。

我想澄清一下,在运行这个函数之后,您得到了什么输出?应该有一些日志消息输出,您可以发布这些吗?例如,当我运行该函数时:

代码语言:javascript
运行
复制
jmcmurray@homer ~/deploy/TorQ (master) $ q torq.q -procname loader -proctype loader -debug
<torq startup messages removed>
q).loader.loadallfiles[`headers`types`separator`tablename`dbdir`partitioncol`dataprocessfunc!(c;"TSSFJFFJJBS";enlist",";`quotes;`:testdb;`date;{[p;t] select date:.z.d,time:TIME,sym:INSTRUMENT,BID,ASK from t});`:csvtest]
2017.11.17D15:03:20.312336000|homer.aquaq.co.uk|loader|loader|INF|dataloader|**** LOADING :csvtest/tradesandquotes20140421.csv ****
2017.11.17D15:03:20.319110000|homer.aquaq.co.uk|loader|loader|INF|dataloader|reading in data chunk
2017.11.17D15:03:20.339414000|homer.aquaq.co.uk|loader|loader|INF|dataloader|Read 11000 rows
2017.11.17D15:03:20.339463000|homer.aquaq.co.uk|loader|loader|INF|dataloader|processing data
2017.11.17D15:03:20.339519000|homer.aquaq.co.uk|loader|loader|INF|dataloader|Enumerating
2017.11.17D15:03:20.340061000|homer.aquaq.co.uk|loader|loader|INF|dataloader|writing 11000 rows to :testdb/2017.11.17/quotes/
2017.11.17D15:03:20.341669000|homer.aquaq.co.uk|loader|loader|INF|dataloader|**** LOADING :csvtest/tradesandquotes20140422.csv ****
2017.11.17D15:03:20.349606000|homer.aquaq.co.uk|loader|loader|INF|dataloader|reading in data chunk
2017.11.17D15:03:20.370793000|homer.aquaq.co.uk|loader|loader|INF|dataloader|Read 11000 rows
2017.11.17D15:03:20.370858000|homer.aquaq.co.uk|loader|loader|INF|dataloader|processing data
2017.11.17D15:03:20.370911000|homer.aquaq.co.uk|loader|loader|INF|dataloader|Enumerating
2017.11.17D15:03:20.371441000|homer.aquaq.co.uk|loader|loader|INF|dataloader|writing 11000 rows to :testdb/2017.11.17/quotes/
2017.11.17D15:03:20.460118000|homer.aquaq.co.uk|loader|loader|INF|init|retrieving sort settings from :/home/jmcmurray/deploy/TorQ/config/sort.csv
2017.11.17D15:03:20.466690000|homer.aquaq.co.uk|loader|loader|INF|sort|sorting the quotes table
2017.11.17D15:03:20.466763000|homer.aquaq.co.uk|loader|loader|INF|sorttab|No sort parameters have been specified for : quotes. Using default parameters
2017.11.17D15:03:20.466820000|homer.aquaq.co.uk|loader|loader|INF|sortfunction|sorting :testdb/2017.11.17/quotes/ by these columns : sym, time
2017.11.17D15:03:20.527216000|homer.aquaq.co.uk|loader|loader|INF|applyattr|applying p attr to the sym column in :testdb/2017.11.17/quotes/
2017.11.17D15:03:20.535095000|homer.aquaq.co.uk|loader|loader|INF|sort|finished sorting the quotes table

在所有这些之后,我可以运行\l testdb,并且有一个名为“引号”的表包含我加载的数据。

如果您可以发布这样的日志记录消息,那么查看一下发生了什么可能会很有帮助。

更新

“但是现在我看到,如果在相同的文件上多次调用该函数,它只是简单地追加重复的数据,而不是对其进行更新。”

如果我正确地理解了这个问题,听起来您可能不应该在相同的文件上多次调用该函数。TorQ中的另一个进程在这里可能很有用,即"档案警报器“。此过程将监视新的和更新的文件的目录,并可以对任何出现的文件调用函数(因此您可以让它使用每个新文件自动调用加载程序函数)。它有许多选项,例如在处理后移动文件(这样您就可以“存档”加载的CSV)。

请注意,文件警报程序要求一个函数接受两个参数--目录&文件名。这实际上意味着在加载程序函数周围需要一个“包装器”函数,它需要一个字典&一个目录。我不认为TorQ包含类似于单个文件的.loader.loadallfiles函数,因此可能需要将目标文件复制到临时目录,在该目录上运行loadallfile,然后在加载下一个文件之前从该目录中删除该文件。

票数 1
EN

Stack Overflow用户

发布于 2017-11-17 10:34:42

“强制转换错误是指未被枚举的值

我在这里看不到任何枚举,磁盘上的splayed表需要枚举符号列。例如,在调用.Q.dpft之前,可以使用下面的行来完成这一操作

代码语言:javascript
运行
复制
volatilitysurface:.Q.en[afolder;volatilitysurface];

您可能会考虑使用示例CSV加载器来加载数据。一个这样的例子包含在TorQ中,KDB框架由AquaQ分析开发(作为免责声明,我为AquaQ工作)

该框架可在这里(免费)使用:https://github.com/AquaQAnalytics/TorQ

您可能会感兴趣的特定组件是dataloader.q,并在这里文档化:http://aquaqanalytics.github.io/TorQ/utilities/#dataloaderq

此脚本将处理所有必需的内容,加载所有文件、枚举、磁盘上的排序、应用属性等,以及使用.Q.fsn防止内存耗尽。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47348199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档