pseudo()

阅读(1012) 标签: 虚表,

本章节介绍pseudo()函数的用法。

pseudo()

描述:

生成虚表定义对象。

语法:

pseudo(pd,n)

备注:

通过定义记录pd生成虚表定义对象。设置参数n后,可从该虚表对象中取出多路游标,n为多路游标的路数。

参数:

pd

为虚表准备的定义记录定义记录是一个有指定结构的序表记录,记录的字段及含义见下面列表。

 

file

虚表的数据来源可以是组表/复组表。该属性必不可少。文件路径可用相对路径和绝对路径。使用相对路径时,相对于主目录。

 

zone

file为复组表时的分区号列表

 

var

序表/内表变量名,无file属性时生成内存虚表

 

date

分列计算式仅对复组表有效。一般为日期、时间或者日期时间型字段。在复组表中,数据会分别存储到各分表中,而存储的依据往往是根据某个时间类型的字段,各个分表分别存储某个时间段的数据,这样的时间字段就是分列计算式。定义分列计算式便于筛选数据。

date字段要求在使用多个文件时,对各个文件有序,但并不要求在单个数据文件中有序,在建立虚表时会记录每个文件的date字段区间,查询或者过滤时自动定位到所需文件中处理。

 

column

特殊字段定义,该定义是一个或多个有指定结构的序表记录,记录的字段及含义见下面列表。

 

 

name

真字段的名称,即在物理表中存在的字段;虚表字段定义以此信息为准。

在过滤表达式中可以使用伪字段,虚表将把关于伪字段的运算转换成关于真字段的,对应的伪字段及变换方式由其它属性定义,无法转换的情况则将伪字段计算出来。append/update时将根据这些属性计算出相应真字段值。

 

 

alias

别名型伪字段列表。当值为字符串时,表示给二值维度伪字段名或真字段的表达式起别名,可以设置多个值,表示有多个别名;当值为表达式时,返回当前表达式的计算结果。

 

 

enum

枚举维度型伪字段名,值是list成员。enum的过滤表达式支持==!=contain

 

 

list

设置枚举维度型伪字段的取值序列。真字段为序号,伪字段取值是本序列成员。

 

 

bits

二值维度型伪字段名。为了减少存储空间的占用,布尔型字段存储时可以用二值字段(取值为 1 0)代替布尔字段,很多个二值字段时可以用二值维度型字段来存储。最多可以存储32个二值字段。定义时按照真字段中从低位到高位对应的字段来设置,各个字段的值都是布尔值false或者true

 

 

exp

alias型的真字段的计算式,在append/update时使用。

冗余字段的计算式,没有伪字段名,表达式中有exp时可替换成本字段。

append/update时也用此表达式计算本字段。

n

多路游标路数,缺省取出单路游标。

选项:

@v

组表产生的虚表,使用纯序表列式计算。

返回值:

虚表对象

示例:

组表作为虚表数据来源:

 

A

 

1

=create(file).record(["D:/file/pseudo/app.ctx"])

为虚表定义记录,组表作为数据来源。

2

=pseudo(A1)

生成虚表对象。

3

=A2.import()

从虚表中取出序表。

复组表作为虚表数据来源:

 

A

 

1

=create(file,zone,date).record(["pseudo/OrderInfo.ctx",[1,2],"OTime"])

为虚表定义记录,用复组表作为虚表数据来源两个分表1.OrderInfo.ctx2.OrderInfo.ctxOTime是日期时间型,该列的数据分别是20202021年的。

2

=pseudo(A1)

生成虚表对象。

3

=A2.select(OTime>date(2020,12,20))

按分列字段过滤数据,程序自动从相应分表获取数据。

4

=A3.import()

以序表形式返回过滤后的数据。

设置参数n

 

A

 

1

=create(file).record(["emp.ctx"])

 

2

=pseudo(A1,3)

生成虚表对象,参数n设为3

3

=A2.cursor()

从虚表中取出多路游标,路数为3

   使用@v选项:

 

A

 

1

=create(file).record(["Emp.ctx"])

 

2

=pseudo@v(A1)

由组表生成虚表对象,使用@v选项,使用纯序表列式计算。

3

=A2.cursor()

生成列式游标。

4

=A2.import()

生成纯序表。

5

=A2.memory()

生成列式内表。

内存虚表:

 

A

 

1

>tab=demo.query("select * from CITIES")

获取CITIES表并将序表存储到变量tab

2

=create(var).record(["tab"])

使用内存表来定义虚表。

3

=pseudo(A2)

生成虚表对象。

4

=A3.select(STATEID==3)

从虚表中获取STATEID3的信息。

5

=A4.import()

虚表特殊字段定义的使用:

emps.ctx的数据如下图:

其中DeptID的字段值为1-5,分别对应部门SalesTechnologyR&DFinancialAdmin

Bools字段存储了2个二值型字段的数据, GenderMarried。在Gender字段中,0表示男性,1表示女性;Married字段中,0表示未婚,1表示已婚。而Bools字段值则是经过bits(Gender,Married)计算的结果。

 

A

 

1

=create(file,column).record(["pseudo/emps.ctx",[{name:"DeptID",enum:"Dept",list:["Sales","Technology","R&D","Financial","Admin"]},

{name:"Bools",bits:["IfMarried","IfLady"]}]])

为虚表定义记录,包含一个枚举维度型伪字段Dept和一个二值维度伪字段Bools

2

=pseudo(A1)

生成虚表对象

3

=A2.import(DeptID,Dept)

DeptID字段值1-5分别对应:["Sales","Technology","R&D","Financial","Admin"]

4

=A2.import(Gender,Married,IfMarried,IfLady)

可看出Gender/MarriedIfLady/IfMarried的对照关系。

虚表特殊字段定义-冗余字段的使用:

Details.ctx的数据如图:

custInfoComment为冗余字段,存放 custInfo.comment 的值。

 

A

 

1

=create(file,column).record(["pseudo/Details.ctx",[{name:"custInfoComment",exp:"custInfo.comment"}]])

为虚表定义了一个计算式 exp:"custInfo.comment",和对应的真实字段 custInfoComment

2

=pseudo(A1)

生成虚表对象。

3

=A2.select(pos(custInfo.comment,"risk"))

过滤条件中出现了计算式,所以并不会取出 custInfo 的记录再取其中的字段,而是被替换成真实字段 custInfoComment

4

=A3.import()

取出过滤结果:

5

=file("pseudo/details_new.btx").cursor@b(id,ddate,device,amt,bools,custInfo)

details_new.btx数据如下:

6

=A2.append(A5)

追加数据,系统会自动转换生成 custInfoComment

7

=A3.import()

追加数据后的Details.ctx

虚表特殊字段定义-字段别名的使用:

Events.ctx的数据如图:

每一行数据是一个事件。每个事件都存储了事件类型 eventType 以及这类事件对应的属性信息 eventInfo

其中事件类型 eventType的字段值为1-3,分别对应appInstallappStartappEnd

eventInfo 是一个记录字段,又包含多个字段,用来存储多个属性。

s1s2f1dt1是真字段,存储三类事件的属性。s1 存储三类事件的三个字符串属性 browserpagepages2 存储三类事件的三个字符串属性devicetitletitlef1存储appInstallappEnd事件的两个数值属性rewardamountdt1存储appInstallappEnd事件的两个日期时间属性dtdt

 

A

 

1

=create(file,column).record(["pseudo/Events.ctx",[{name:"eventType",alias:null,enum:"eventTypeString",list:["appInstall","appStart","appEnd"],exp:null},

{name:"s1",alias:["browser","appStart_page","appEnd_page"],enum:null,list:null,exp:"case(eventType,1:eventInfo.browser,2:eventInfo.page,3:eventInfo.page)"},

{name:"s2",alias:["device","appStart_title","appEnd_title"],enum:null,list:null,exp:"case(eventType,1:eventInfo.device,2:eventInfo.title,3:eventInfo.title)"},

{name:"f1",alias:["reward","amount"],enum:null,list:null,exp:"case(eventType,1:eventInfo.reward,3:eventInfo.amount)"},

{name:"dt1",alias:["appStart_dt","appEnd_dt"],enum:null,list:null,exp:"case(eventType,2:eventInfo.dt,3:eventInfo.dt)"}]])

在虚表的定义中为每个真字段配置多个有业务含义的别名。

真字段 s1 的三个别名 "browser","appStart_page","appEnd_page",以及对应的计算式 exp:"case(eventType, 1:eventInfo.browser, 2: eventInfo.page, 3: eventInfo.page)"

eventType 取值如果不是 12 或者 3,真字段 s1 应该为 null。所以这里不能写成 case(eventType, 1:eventInfo.browser;eventInfo.page)

s2f1dt1 的写法和 s1 类似。

2

=pseudo(A1)

生成虚表对象

3

=A2.select(eventTypeString=="appInstall" && browser=="firefox")

过滤条件中出现了字段别名,SPL 并不会取出 eventInfo 的记录再取其中的字段,而是自动替换成真实字段 s1,用冗余字段的值完成后续计算。

4

=A3.import(id,eventTypeString,browser,reward)

取出过滤结果

5

=file("pseudo/events_new.btx").cursor@b(id,eventTypeString,eventInfo)

events_new.btx数据如下:

6

=A2.append(A5)

追加数据。系统会根据eventTypeStringeventInfo自动生成 s1f1 等。

7

=A2.import()

追加数据后的Events.ctx

 

T.pseudo(T’,…)

描述:

设置虚表同步分段。

语法:

T.pseudo(T’,…)

备注:

根据虚表T设置虚表T’,… 使用T同样的分段。设置虚表分段后,可从该虚表对象中取出多路游标。

参数:

T

已分段的虚表对象。

T’

待分段的虚表对象。

示例:

 

A

 

1

=create(file).record(["emp1.ctx"])

 

2

=pseudo(A1,3)

由组表生成虚表对象,设置路数为3

3

=create(file).record(["emp2.ctx"])

 

4

=pseudo(A3)

生成虚表对象。

5

=A2.pseudo(A4)

对虚表A4使用A2同样的分段。

6

=A4.cursor()

A4 中取出多路游标。