将数据加载到 Redshift 后,Redshift 表不保留 SAS 排序顺序

问题描述

当我使用 PROC SORT 将按键(包含重复键)排序的 SAS 数据集加载到 Redshift 中时,Redshift 中不会保留相同的排序顺序。例如。当我将 SAS 数据集与 Redshift 表进行比较时,它们的排序顺序不同,数据在重复键中非常混乱,很难找到数据如何存储在 Redshift 列中的模式或为什么会发生这种情况。

SAS dataset vs Redshift table sort order

]1

在数据从 SAS 加载到 Redshift 后保持相同排序的任何建议或指导都会非常有帮助。谢谢!

使用的代码

PROC APPEND BASE = Target_Table (bulkload=yes bl_compress=yes bl_bucket='xxx' bl_default_dir = 'xxx' bl_use_escape =YES) 
DATA = Source_Table force; 
RUN;

解决方法

创建表时需要设置sortkey,例如:

proc sql;
connect using myredlib as rs;
execute (create table iwant (
   key INTEGER,data char(1),load_dttm TIMESTAMP
)
distkey(key)
compound sortkey(key,data) )by rs;

如果您有重复项或者您只需要保留源数据顺序,则在追加之前的数据步骤中创建一个新列(例如 id),例如:

data iwant;
  set ihave;
  id=_n_;
run;
proc append .....
,

这取决于追加开始时目标表的状态。

默认情况下,IIRC 新表没有固有的排序顺序,并且仅当 SQL 查询具有 ORDER BY 子句时才能保证排序结果集。

表可以具有 SORT ORDERINTERLEAVED SORT KEYS 等功能,但必须添加通过 Proc SQL pass through EXECUTE BY 或 Amazon Redshift 控制台执行的 RedShift 语句。

有关更多有用信息,请参阅 SO Why does Redshift not need materialized views or indexes?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...