连接分布式表

连接分布式表时,若不使用 select, where 等过滤语句,返回的表会包含过多冗余数据。因此,DolphinDB 只能在 SQL 语句中进行分布式表连接。

分布式表连接时,需要遵循以下规则:

1. 如果左表和右表都是分布式表:

  • 两个表必须位于同一个数据库中。

  • 连接列必须包含所有分区列。连接列亦可包含非分区列。

  • 不支持cross join。

2. 如果只有右表是分布式表,则只能使用equi join。

3. 如果左表是分布式表 ,右表是维度表或内存表,则不支持full join。当分布式分区表与非分区表(维度表或内存表)进行连接时,系统会将非分区表复制到分区表所在的各个数据节点上执行连接操作。系统会先根据where指定的条件对非分区表进行过滤,然后进行复制传输。数据表连接查询的性能和网络传输性能以及非分区表的数据量有关。所以,为保证表连接查询速度,建议非分区表的数据量不要过大。

4. 分布式表可以与任意数据库中的维度表进行连接。

例子

创建数据库的脚本如下:

$ dates=2019.01.01..2019.01.31
$ syms="A"+string(1..30)
$ sym_range=cutPoints(syms,3)
$ db1=database("",VALUE,dates)
$ db2=database("",RANGE,sym_range)
$ db=database("dfs://stock",COMPO,[db1,db2])
$ n=10000
$ datetimes=2019.01.01T00:00:00..2019.01.31T23:59:59
$ t=table(take(datetimes,n) as trade_time,take(syms,n) as sym,rand(1000,n) as qty,rand(500.0,n) as price)
$ trades=db.createPartitionedTable(t,`trades,`trade_time`sym).append!(t)

$ n=200
$ t2=table(take(datetimes,n) as trade_time,take(syms,n) as sym,rand(500.0,n) as bid,rand(500.0,n) as offer)
$ quotes=db.createPartitionedTable(t2,`quotes,`trade_time`sym).append!(t2)

$ t3=table(syms as sym,take(0 1,30) as type)
$ infos=db.createTable(t3,`infos).append!(t3)

例1. 连接两个分布式表trades和quotes:

select * from ej(trades,quotes,`trade_time`sym);

trade_time

sym

qty

price

bid

offer

2019.01.01T00:00:00

A1

39

7.366735

37.933525

446.917644

2019.01.01T00:00:09

A10

15

461.381014

405.092702

26.659516

2019.01.01T00:00:10

A11

987

429.981704

404.289413

347.64917

2019.01.01T00:00:11

A12

266

60.466206

420.426175

83.538043

2019.01.01T00:00:12

A13

909

362.057769

324.886047

162.502655

2019.01.01T00:00:13

A14

264

113.964472

497.598722

103.114702

2019.01.01T00:00:14

A15

460

347.518325

24.584629

357.854207

2019.01.01T00:00:15

A16

196

258.889177

49.467399

13.974672

2019.01.01T00:00:16

A17

198

403.564922

428.539984

208.410852

2019.01.01T00:00:17

A18

30

288.469046

41.905556

378.080141

例2. 连接分布式表和维度表:

select * from lj(trades,infos,`sym);

trade_time

sym

qty

price

type

2019.01.01T00:00:00

A1

856

359.809918

0

2019.01.01T00:00:09

A10

368

305.801702

1

2019.01.01T00:00:10

A11

549

447.406744

0

2019.01.01T00:00:11

A12

817

115.613373

1

2019.01.01T00:00:12

A13

321

298.317481

0

2019.01.01T00:00:13

A14

3

2.289171

1

2019.01.01T00:00:14

A15

586

91.841629

0

2019.01.01T00:00:15

A16

745

43.256142

1

2019.01.01T00:00:16

A17

60

0.153205

0

例3. 连接分布式表和内存表:

tmp=table("A"+string(1..15) as sym,2019.01.11..2019.01.25 as date);
select * from ej(trades,tmp,`sym);

trade_time

sym

qty

price

date

2019.01.01T00:00:00

A1

856

359.809918

2019.01.11

2019.01.01T00:00:09

A10

368

305.801702

2019.01.20

2019.01.01T00:00:10

A11

549

447.406744

2019.01.21

2019.01.01T00:00:11

A12

817

115.613373

2019.01.22

2019.01.01T00:00:12

A13

321

298.317481

2019.01.23

2019.01.01T00:00:13

A14

3

2.289171

2019.01.24

2019.01.01T00:00:14

A15

586

91.841629

2019.01.25

2019.01.01T00:00:30

A1

390

325.407485

2019.01.11

更多连接方式请查看 表连接