“BY 变量未正确排序”错误,尽管它已经排序

Posted

技术标签:

【中文标题】“BY 变量未正确排序”错误,尽管它已经排序【英文标题】:"BY variables are not properly sorted" error although it was sorted already 【发布时间】:2017-04-04 06:11:19 【问题描述】:

我将 SAS 用于大型数据集 (>20gb)。当我运行 DATA 步骤时,我收到“BY 变量未正确排序......”尽管我按相同的变量对数据集进行了排序。当我再次运行 PROC SORT 时,SAS 甚至说“输入数据集已排序,未完成排序” 我的代码是:

proc sort data=output.TAQ;
    by market ric date miliseconds descending type order;
run;

options nomprint;

data markers (keep=market ric date miliseconds type order);
    set output.TAQ;
    by market ric date;

    if first.date;

    * ie do the following once per stock-day;
    * Make 1-second markers;

    /*Type="AMARK"; Order=0; * Set order to zero to ensure that markers get placed before trades and quotes that occur at the same milisecond;
    do i=((9*60*60)+(30*60)) to (16*60*60); miliseconds=i*1000; output; end;*/
run;

错误信息是:

ERROR: BY variables are not properly sorted on data set OUTPUT.TAQ.
RIC=CXR.CCP Date=20160914 Time=13:47:18.125 Type=Quote Price=. Volume=. BidPrice=9.03 BidSize=400
AskPrice=9.04 AskSize=100 Qualifiers=  order=116458952 Miliseconds=49638125 exchange=CCP market=1
FIRST.market=0 LAST.market=0 FIRST.RIC=0 LAST.RIC=0 FIRST.Date=0 LAST.Date=1 i=. _ERROR_=1
_N_=43297873
NOTE: The SAS System stopped processing this step because of errors.
NOTE: There were 43297874 observations read from the data set OUTPUT.TAQ.
WARNING: The data set WORK.MARKERS may be incomplete.  When this step was stopped there were
         56770826 observations and 6 variables.
WARNING: Data set WORK.MARKERS was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
      real time           1:14.21
      cpu time            26.71 seconds

【问题讨论】:

您在运行 proc sort 时是否在日志中收到错误消息? 肯定需要查看更多日志。观察计数非常奇怪 - 你有'if first.date',所以标记应该是 output.taq 的一个子集,但是在处理停止的时候,已经读取了 ~43.3m obs in从 output.taq 和 ~56.8m 已写入 out 到 work.markers... @keydemographic 在 do-loop 中有一个输出语句,所以 obs 计数可以做各种各样的事情。 尝试将 FORCE 选项添加到 PROC SORT。可能只有 SAS 认为它已经排序。显然,在某些情况下,数据集的 SOLTEDBY 属性可能是错误的。 跳转到观察 #43297873 并从那里检查 +/- 5 个观察结果,以了解为什么它会说它没有按正确的顺序排序。 data check; set output.taq (firstobs=43297868 obs=43297878); run; 【参考方案1】:

错误发生在您的数据步骤的深处,位于_N_=43297873。这向我表明PROC SORT 正在工作到一定程度,但随后失败了。如果不了解您的 SAS 环境或 OUTPUT.TAQ 的存储方式,很难知道原因是什么。

有些人在对大型数据集进行排序时报告了资源问题或文件系统限制。

来自SAS FAQ: Sorting Very Large Datasets with SAS(非官方来源):

在 WORK 文件夹中排序时,您的可用存储空间必须等于数据集大小的 4 倍(如果在 Unix 下,则为 5 倍)

你的内存可能用完了

您可以使用选项MSGLEVEL=iFULLSTIMER 获得更全面的信息

同时使用options sastraceloc=saslog; 可以产生有用的消息。

也许您可以将其分解为几个步骤,而不是对其进行排序,例如:

/* Get your market ~ ric ~ date pairs */
proc sql;
   create table market_ric_date as
   select distinct market, ric, date
   from output.TAQ
   /* Possibly an order by clause here on market, ric, date */
; quit;

data millisecond_stuff;
  set market_ric_date; 
  *Possibly add type/order in this step as well?;
  do i=((9*60*60)+(30*60)) to (16*60*60); miliseconds=i*1000; output; end;
run;

/* Possibly a third step here to add type / order if you need to get from original data source */

【讨论】:

【参考方案2】:

如果您的源数据集在数据库中,它可能会以不同的排序规则进行排序。

在排序之前尝试以下操作:

options sortpgm=sas;

【讨论】:

【参考方案3】:

我遇到了同样的错误,解决方法是在工作目录中复制原始表,进行排序,然后“by”就可以了。

在您的情况下,如下所示:

data tmp_TAQ;
    set output.TAQ;
run;

proc sort data=tmp_TAQ;
    by market ric date miliseconds descending type order;
run;

data markers (keep=market ric date miliseconds type order);
    set tmp_TAQ;
    by market ric date;

    if first.date;

    * ie do the following once per stock-day;
    * Make 1-second markers;

    /*Type="AMARK"; Order=0; * Set order to zero to ensure that markers get placed before trades and quotes that occur at the same milisecond;
    do i=((9*60*60)+(30*60)) to (16*60*60); miliseconds=i*1000; output; end;*/
run;

【讨论】:

以上是关于“BY 变量未正确排序”错误,尽管它已经排序的主要内容,如果未能解决你的问题,请参考以下文章

尽管下载了ffmpeg并设置了路径变量python,但没有后端错误

Ansible 要求安装 MySQL-python,尽管它已经安装

ivy.xml 的 SBT 下载错误,尽管它存在

显示错误输出的快速排序算法

尽管我的数组已排序,但 Uipickerview 未排序

SpringBoot 在生产中没有找到错误模板,尽管它在 Netbeans 中找到了它