dolphindb 2.0.526 → 2.0.529
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser.d.ts +3 -3
- package/browser.js +248 -264
- package/browser.js.map +1 -1
- package/docs.en.json +2732 -276
- package/docs.zh.json +1939 -360
- package/index.d.ts +4 -3
- package/index.js +287 -304
- package/index.js.map +1 -1
- package/language.js +5 -8
- package/language.js.map +1 -1
- package/package.json +8 -8
package/docs.zh.json
CHANGED
|
@@ -734,13 +734,13 @@
|
|
|
734
734
|
{
|
|
735
735
|
"type": "text",
|
|
736
736
|
"value": [
|
|
737
|
-
"
|
|
737
|
+
"支持当前用户通过此命令,给自己创建的表增加权限限制。增加权限限制后,只有通过管理员赋予权限后才可访问该表。",
|
|
738
738
|
"",
|
|
739
739
|
"请注意:",
|
|
740
740
|
"",
|
|
741
|
-
"
|
|
741
|
+
"1. 只能由创建 table 的用户或者管理员执行该命令。",
|
|
742
742
|
"",
|
|
743
|
-
"
|
|
743
|
+
"2. 如果管理员已经为其他用户 grant/deny/revoke 该表的权限,则该表自动添加权限限制,其他未经授权的用户无法再访问该表,建表用户无需调用 ``addAccessControl`` 对表进行访问管理。"
|
|
744
744
|
]
|
|
745
745
|
}
|
|
746
746
|
]
|
|
@@ -2082,13 +2082,13 @@
|
|
|
2082
2082
|
"",
|
|
2083
2083
|
"`newData` 可以是标量、向量、表或集合。",
|
|
2084
2084
|
"",
|
|
2085
|
-
"* 如果obj是向量,则newData必须是标量或向量。结果是比obj更长的向量。",
|
|
2085
|
+
"* 如果 *obj* 是向量,则 *newData* 必须是标量或向量。结果是比 *obj* 更长的向量。",
|
|
2086
2086
|
"",
|
|
2087
|
-
"* 如果obj是矩阵,则 newData 必须是长度为obj行数倍数的向量。结果是新的矩阵,行数和obj相同,具有更多的列数。",
|
|
2087
|
+
"* 如果 *obj* 是矩阵,则 *newData* 必须是长度为 *obj* 行数倍数的向量。结果是新的矩阵,行数和 *obj* 相同,具有更多的列数。",
|
|
2088
2088
|
"",
|
|
2089
|
-
"* 如果obj是表,则newData必须是一个列数和obj
|
|
2090
|
-
"",
|
|
2091
|
-
"* 如果newData和obj的数据类型不同,append! 函数会尝试将 newData转换为obj
|
|
2089
|
+
"* 如果 *obj* 是表,则 *newData* 必须是一个列数和 *obj* 相同的表。结果是和 *obj* 具有相同列数和列名的表,但行数比 *obj* 多。",
|
|
2090
|
+
" ",
|
|
2091
|
+
"* 如果 *newData* 和 *obj* 的数据类型不同,append! 函数会尝试将 *newData* 转换为 *obj* 的数据类型。如果无法转换,将返回一个错误信息。",
|
|
2092
2092
|
""
|
|
2093
2093
|
]
|
|
2094
2094
|
}
|
|
@@ -2101,7 +2101,9 @@
|
|
|
2101
2101
|
{
|
|
2102
2102
|
"type": "text",
|
|
2103
2103
|
"value": [
|
|
2104
|
-
"将newData中的数据追加到obj
|
|
2104
|
+
"将 *newData* 中的数据追加到 *obj*。在 DolphinDB 中,函数中的感叹号(!)表示直接修改数据本身(就地操作)。",
|
|
2105
|
+
"",
|
|
2106
|
+
"请注意,该函数不会检查两表中各列列名与顺序,只要两表中对应位置的列的数据类型一致,即可执行。如果两表中各列顺序有差别,该操作不会自动对齐各列。所以,对数据表进行 append! 操作时,请检查两表中各列列名与顺序,以免出错。绝大部分情况下两表中各列列名与顺序应当完全一致。"
|
|
2105
2107
|
]
|
|
2106
2108
|
}
|
|
2107
2109
|
]
|
|
@@ -2265,94 +2267,7 @@
|
|
|
2265
2267
|
" $ Trades.append!(t1)",
|
|
2266
2268
|
" $ select count(*) from Trades",
|
|
2267
2269
|
"",
|
|
2268
|
-
" 1500000"
|
|
2269
|
-
""
|
|
2270
|
-
]
|
|
2271
|
-
},
|
|
2272
|
-
{
|
|
2273
|
-
"type": "text",
|
|
2274
|
-
"value": [
|
|
2275
|
-
"* 使用 *append!* 把数据追加到本地磁盘表。",
|
|
2276
|
-
""
|
|
2277
|
-
]
|
|
2278
|
-
},
|
|
2279
|
-
{
|
|
2280
|
-
"type": "code",
|
|
2281
|
-
"language": "console",
|
|
2282
|
-
"value": [
|
|
2283
|
-
"",
|
|
2284
|
-
" $ n=1000000",
|
|
2285
|
-
" $ t=table(rand(`IBM`MS`APPL`AMZN,n) as symbol, rand(10.0, n) as value)",
|
|
2286
|
-
" $ db = database(\"C:/DolphinDB/Data/rangedb_tradedata\", RANGE, `A`F`M`S`ZZZZ)",
|
|
2287
|
-
" $ Trades = db.createPartitionedTable(t, \"Trades\", \"symbol\")",
|
|
2288
|
-
" $ Trades.append!(t);",
|
|
2289
|
-
""
|
|
2290
|
-
]
|
|
2291
|
-
},
|
|
2292
|
-
{
|
|
2293
|
-
"type": "text",
|
|
2294
|
-
"value": [
|
|
2295
|
-
"下例说明,对本地磁盘表执行完 *append!* 操作后,需将表的元数据加载到内存之后,方可执行查询操作。",
|
|
2296
|
-
""
|
|
2297
|
-
]
|
|
2298
|
-
},
|
|
2299
|
-
{
|
|
2300
|
-
"type": "code",
|
|
2301
|
-
"language": "console",
|
|
2302
|
-
"value": [
|
|
2303
|
-
"",
|
|
2304
|
-
" $ select count(*) from Trades;",
|
|
2305
|
-
" 0",
|
|
2306
|
-
"",
|
|
2307
|
-
" $ Trades=loadTable(db, `Trades)",
|
|
2308
|
-
" $ select count(*) from Trades;",
|
|
2309
|
-
"",
|
|
2310
|
-
" 1000000",
|
|
2311
|
-
""
|
|
2312
|
-
]
|
|
2313
|
-
},
|
|
2314
|
-
{
|
|
2315
|
-
"type": "text",
|
|
2316
|
-
"value": [
|
|
2317
|
-
"把其他表的数据追加到表Trades中。",
|
|
2318
|
-
""
|
|
2319
|
-
]
|
|
2320
|
-
},
|
|
2321
|
-
{
|
|
2322
|
-
"type": "code",
|
|
2323
|
-
"language": "console",
|
|
2324
|
-
"value": [
|
|
2325
|
-
"",
|
|
2326
|
-
" $ n=500000",
|
|
2327
|
-
" $ t1=table(rand(`FB`GE`MSFT,n) as symbol, rand(100.0, n) as value)",
|
|
2328
|
-
" $ Trades.append!(t1)",
|
|
2329
|
-
""
|
|
2330
|
-
]
|
|
2331
|
-
},
|
|
2332
|
-
{
|
|
2333
|
-
"type": "text",
|
|
2334
|
-
"value": [
|
|
2335
|
-
"如果需要使用表Trades的最新数据,我们需要重新加载。",
|
|
2336
|
-
""
|
|
2337
|
-
]
|
|
2338
|
-
},
|
|
2339
|
-
{
|
|
2340
|
-
"type": "code",
|
|
2341
|
-
"language": "console",
|
|
2342
|
-
"value": [
|
|
2343
|
-
"",
|
|
2344
|
-
" $ Trades=loadTable(db, `Trades)",
|
|
2345
|
-
" $ size(Trades);",
|
|
2346
|
-
"",
|
|
2347
|
-
" 1500000",
|
|
2348
|
-
""
|
|
2349
|
-
]
|
|
2350
|
-
},
|
|
2351
|
-
{
|
|
2352
|
-
"type": "text",
|
|
2353
|
-
"value": [
|
|
2354
|
-
".. meta:: ",
|
|
2355
|
-
" :keywords: 磁盘表"
|
|
2270
|
+
" 1500000"
|
|
2356
2271
|
]
|
|
2357
2272
|
}
|
|
2358
2273
|
]
|
|
@@ -2613,7 +2528,7 @@
|
|
|
2613
2528
|
{
|
|
2614
2529
|
"type": "text",
|
|
2615
2530
|
"value": [
|
|
2616
|
-
"asfreq(X,
|
|
2531
|
+
"asfreq(X, rule, [closed], [label], [origin='start_day'])"
|
|
2617
2532
|
]
|
|
2618
2533
|
}
|
|
2619
2534
|
]
|
|
@@ -2659,7 +2574,27 @@
|
|
|
2659
2574
|
"\"N\" nanosecond",
|
|
2660
2575
|
"============ =================",
|
|
2661
2576
|
"",
|
|
2662
|
-
"参数Y字符串亦可配合使用数字,例如\"2M\"表示频率为每两个月。"
|
|
2577
|
+
"参数 *Y* 字符串亦可配合使用数字,例如\"2M\"表示频率为每两个月。",
|
|
2578
|
+
"",
|
|
2579
|
+
"`closed` 字符串,表示分组区间哪一个边界是闭合的。",
|
|
2580
|
+
"",
|
|
2581
|
+
"* *rule* 为 'M', 'A', 'Q', 'BM', 'BA', 'BQ' 和 'W' 时,*closed* 的默认取值为 'right' ,否则,*closed* 的默认取值为 'left'。",
|
|
2582
|
+
"* *origin* 取 'end' 或者 'end_day' 时,*closed* 的默认值为 'right'。",
|
|
2583
|
+
"* 1.30.18/2.00.6 版本,当 *rule* 的精度为天以上时,不支持使用默认值以外的选项。",
|
|
2584
|
+
"",
|
|
2585
|
+
"`label` 字符串,表示将分组区间的哪一个边界作为 *label* 输出。",
|
|
2586
|
+
"",
|
|
2587
|
+
"* *rule* 为 'M', 'A', 'Q', 'BM', 'BA', 'BQ' 和 'W' 时,*label* 的默认取值为 'right' ,否则,*label* 的默认取值为 'left'。",
|
|
2588
|
+
"* *origin* 取 'end' 或者 'end_day' 时,*label* 的默认值为 'right'。",
|
|
2589
|
+
"* 1.30.18/2.00.6 版本,当 *rule* 的精度为天以上时,不支持使用默认值以外的选项。",
|
|
2590
|
+
"",
|
|
2591
|
+
"`origin` 字符串或和 *X* 具有相同时间类型的标量,表示基于时间戳调整分组。取值为 'epoch', start', 'start_day', 'end', 'end_day' 或自定义的时间对象,默认值为 'start_day'。",
|
|
2592
|
+
"",
|
|
2593
|
+
"* 'epoch':分组起始点为1970-01-01。",
|
|
2594
|
+
"* 'start':分组起始点为时间序列的第一个值。",
|
|
2595
|
+
"* 'start_day':分组起始点是时间序列的第一个值对应日期的午夜零点。",
|
|
2596
|
+
"* 'end':分组起始点是时间序列的最后一个时间戳。",
|
|
2597
|
+
"* 'end_day':分组起始点是时间序列的最后一个时间戳对应日期的午夜24点(即下一日的零点)。"
|
|
2663
2598
|
]
|
|
2664
2599
|
}
|
|
2665
2600
|
]
|
|
@@ -2826,7 +2761,90 @@
|
|
|
2826
2761
|
"2020.01.01 1",
|
|
2827
2762
|
"2020.01.03 2",
|
|
2828
2763
|
"2020.01.05 ",
|
|
2829
|
-
"=========== =="
|
|
2764
|
+
"=========== ==",
|
|
2765
|
+
""
|
|
2766
|
+
]
|
|
2767
|
+
},
|
|
2768
|
+
{
|
|
2769
|
+
"type": "code",
|
|
2770
|
+
"language": "console",
|
|
2771
|
+
"value": [
|
|
2772
|
+
"",
|
|
2773
|
+
" $ index = temporalAdd(2022.10.01 23:30:00,7*(0..8),`m)",
|
|
2774
|
+
" $ s = indexedSeries(index, 3*(0..8))",
|
|
2775
|
+
" $ s.asfreq(\"8min\")",
|
|
2776
|
+
""
|
|
2777
|
+
]
|
|
2778
|
+
},
|
|
2779
|
+
{
|
|
2780
|
+
"type": "text",
|
|
2781
|
+
"value": [
|
|
2782
|
+
"=================== ====",
|
|
2783
|
+
"label\t col1",
|
|
2784
|
+
"=================== ====",
|
|
2785
|
+
"2022.10.01T23:28:00\t",
|
|
2786
|
+
"2022.10.01T23:36:00\t",
|
|
2787
|
+
"2022.10.01T23:44:00\t6",
|
|
2788
|
+
"2022.10.01T23:52:00\t",
|
|
2789
|
+
"2022.10.02T00:00:00\t",
|
|
2790
|
+
"2022.10.02T00:08:00\t",
|
|
2791
|
+
"2022.10.02T00:16:00\t",
|
|
2792
|
+
"2022.10.02T00:24:00",
|
|
2793
|
+
"=================== ====",
|
|
2794
|
+
""
|
|
2795
|
+
]
|
|
2796
|
+
},
|
|
2797
|
+
{
|
|
2798
|
+
"type": "code",
|
|
2799
|
+
"language": "console",
|
|
2800
|
+
"value": [
|
|
2801
|
+
"",
|
|
2802
|
+
" $ s.asfreq(rule=`8min,closed=`right)",
|
|
2803
|
+
""
|
|
2804
|
+
]
|
|
2805
|
+
},
|
|
2806
|
+
{
|
|
2807
|
+
"type": "text",
|
|
2808
|
+
"value": [
|
|
2809
|
+
"=================== ====",
|
|
2810
|
+
"label\t col1",
|
|
2811
|
+
"=================== ====",
|
|
2812
|
+
"2022.10.01T23:36:00\t",
|
|
2813
|
+
"2022.10.01T23:44:00\t6",
|
|
2814
|
+
"2022.10.01T23:52:00\t",
|
|
2815
|
+
"2022.10.02T00:00:00\t",
|
|
2816
|
+
"2022.10.02T00:08:00\t",
|
|
2817
|
+
"2022.10.02T00:16:00\t",
|
|
2818
|
+
"2022.10.02T00:24:00\t",
|
|
2819
|
+
"2022.10.02T00:32:00",
|
|
2820
|
+
"=================== ====",
|
|
2821
|
+
""
|
|
2822
|
+
]
|
|
2823
|
+
},
|
|
2824
|
+
{
|
|
2825
|
+
"type": "code",
|
|
2826
|
+
"language": "console",
|
|
2827
|
+
"value": [
|
|
2828
|
+
"",
|
|
2829
|
+
" $ s.asfreq(rule=`8min,closed=`right,origin=`end)",
|
|
2830
|
+
""
|
|
2831
|
+
]
|
|
2832
|
+
},
|
|
2833
|
+
{
|
|
2834
|
+
"type": "text",
|
|
2835
|
+
"value": [
|
|
2836
|
+
"=================== ====",
|
|
2837
|
+
"label\t col1",
|
|
2838
|
+
"=================== ====",
|
|
2839
|
+
"2022.10.01T23:30:00\t0",
|
|
2840
|
+
"2022.10.01T23:38:00\t",
|
|
2841
|
+
"2022.10.01T23:46:00\t",
|
|
2842
|
+
"2022.10.01T23:54:00\t",
|
|
2843
|
+
"2022.10.02T00:02:00\t",
|
|
2844
|
+
"2022.10.02T00:10:00\t",
|
|
2845
|
+
"2022.10.02T00:18:00\t",
|
|
2846
|
+
"2022.10.02T00:26:00\t24",
|
|
2847
|
+
"=================== ===="
|
|
2830
2848
|
]
|
|
2831
2849
|
}
|
|
2832
2850
|
]
|
|
@@ -3217,9 +3235,9 @@
|
|
|
3217
3235
|
{
|
|
3218
3236
|
"type": "text",
|
|
3219
3237
|
"value": [
|
|
3220
|
-
"找出 *location* 中最大值所在的位置,然后返回 *value*
|
|
3238
|
+
"找出 *location* 中最大值所在的位置,然后返回 *value* 中该位置对应的值。如果 *location* 中有多个相同的最大值,则取第一个最大值所在的位置。",
|
|
3221
3239
|
"",
|
|
3222
|
-
"
|
|
3240
|
+
"若 *location* 和 *value* 是矩阵,则 *location* 和 *value* 的每列一一对应,分别计算 ``atImax``。",
|
|
3223
3241
|
"",
|
|
3224
3242
|
"atImax(location, value) 相当于 value[imax(location)]。",
|
|
3225
3243
|
""
|
|
@@ -3294,9 +3312,9 @@
|
|
|
3294
3312
|
{
|
|
3295
3313
|
"type": "text",
|
|
3296
3314
|
"value": [
|
|
3297
|
-
"找出 *location* 中最小值所在的位置,然后返回 *value*
|
|
3315
|
+
"找出 *location* 中最小值所在的位置,然后返回 *value* 中该位置对应的值。如果 *location* 中有多个相同的最小值,则取第一个最小值所在的位置。",
|
|
3298
3316
|
"",
|
|
3299
|
-
"
|
|
3317
|
+
"若 *location* 和 *value* 是矩阵,则 *location* 和 *value* 的每列一一对应,分别计算 ``atImin``。",
|
|
3300
3318
|
"",
|
|
3301
3319
|
"atImin(location, value) 相当于 value[imin(location)]。",
|
|
3302
3320
|
""
|
|
@@ -4463,7 +4481,7 @@
|
|
|
4463
4481
|
"",
|
|
4464
4482
|
"操作大数组的方法和操作一个常规数组一样。",
|
|
4465
4483
|
"",
|
|
4466
|
-
"当我们调用 :doc:`../a/array` 函数时,如果没有足够的连续内存块,或数组占据的内存超过了一个特定的阈值(默认的阈值是
|
|
4484
|
+
"当我们调用 :doc:`../a/array` 函数时,如果没有足够的连续内存块,或数组占据的内存超过了一个特定的阈值(默认的阈值是 2048 MB),系统会改为创建一个大数组。"
|
|
4467
4485
|
]
|
|
4468
4486
|
}
|
|
4469
4487
|
]
|
|
@@ -4718,7 +4736,7 @@
|
|
|
4718
4736
|
{
|
|
4719
4737
|
"type": "text",
|
|
4720
4738
|
"value": [
|
|
4721
|
-
"`X` 和 `Y`
|
|
4739
|
+
"`X` 和 `Y` 可以是数值型的标量,向量,矩阵,或数据表。"
|
|
4722
4740
|
]
|
|
4723
4741
|
}
|
|
4724
4742
|
]
|
|
@@ -4754,6 +4772,67 @@
|
|
|
4754
4772
|
}
|
|
4755
4773
|
]
|
|
4756
4774
|
},
|
|
4775
|
+
"bitNot": {
|
|
4776
|
+
"title": "bitNot",
|
|
4777
|
+
"type": "function",
|
|
4778
|
+
"children": [
|
|
4779
|
+
{
|
|
4780
|
+
"title": "语法",
|
|
4781
|
+
"type": "grammer",
|
|
4782
|
+
"children": [
|
|
4783
|
+
{
|
|
4784
|
+
"type": "text",
|
|
4785
|
+
"value": [
|
|
4786
|
+
"bitNot(X)"
|
|
4787
|
+
]
|
|
4788
|
+
}
|
|
4789
|
+
]
|
|
4790
|
+
},
|
|
4791
|
+
{
|
|
4792
|
+
"title": "参数",
|
|
4793
|
+
"type": "parameters",
|
|
4794
|
+
"children": [
|
|
4795
|
+
{
|
|
4796
|
+
"type": "text",
|
|
4797
|
+
"value": [
|
|
4798
|
+
"`X` 可以是数值型的标量,向量,矩阵,或数据表。"
|
|
4799
|
+
]
|
|
4800
|
+
}
|
|
4801
|
+
]
|
|
4802
|
+
},
|
|
4803
|
+
{
|
|
4804
|
+
"title": "详情",
|
|
4805
|
+
"type": "detail",
|
|
4806
|
+
"children": [
|
|
4807
|
+
{
|
|
4808
|
+
"type": "text",
|
|
4809
|
+
"value": [
|
|
4810
|
+
"返回按位取反的结果。"
|
|
4811
|
+
]
|
|
4812
|
+
}
|
|
4813
|
+
]
|
|
4814
|
+
},
|
|
4815
|
+
{
|
|
4816
|
+
"title": "例子",
|
|
4817
|
+
"type": "example",
|
|
4818
|
+
"children": [
|
|
4819
|
+
{
|
|
4820
|
+
"type": "code",
|
|
4821
|
+
"language": "console",
|
|
4822
|
+
"value": [
|
|
4823
|
+
"",
|
|
4824
|
+
" $ bitNot(3)",
|
|
4825
|
+
" -4",
|
|
4826
|
+
"",
|
|
4827
|
+
" $ av = array(INT[], 0, 10).append!([1 2 3, 4 5])",
|
|
4828
|
+
" $ bitNot(av)",
|
|
4829
|
+
" [[-2,-3,-4],[-5,-6]]"
|
|
4830
|
+
]
|
|
4831
|
+
}
|
|
4832
|
+
]
|
|
4833
|
+
}
|
|
4834
|
+
]
|
|
4835
|
+
},
|
|
4757
4836
|
"bitOr": {
|
|
4758
4837
|
"title": "bitOr",
|
|
4759
4838
|
"type": "function",
|
|
@@ -4777,7 +4856,7 @@
|
|
|
4777
4856
|
{
|
|
4778
4857
|
"type": "text",
|
|
4779
4858
|
"value": [
|
|
4780
|
-
"`X` 和 `Y`
|
|
4859
|
+
"`X` 和 `Y` 可以是数值型的标量,向量,矩阵,或数据表。"
|
|
4781
4860
|
]
|
|
4782
4861
|
}
|
|
4783
4862
|
]
|
|
@@ -4837,7 +4916,7 @@
|
|
|
4837
4916
|
{
|
|
4838
4917
|
"type": "text",
|
|
4839
4918
|
"value": [
|
|
4840
|
-
"`X` 和 `Y`
|
|
4919
|
+
"`X` 和 `Y` 可以是数值型的标量,向量,矩阵,或数据表。"
|
|
4841
4920
|
]
|
|
4842
4921
|
}
|
|
4843
4922
|
]
|
|
@@ -7717,11 +7796,11 @@
|
|
|
7717
7796
|
{
|
|
7718
7797
|
"type": "text",
|
|
7719
7798
|
"value": [
|
|
7720
|
-
"`obj`
|
|
7799
|
+
"`obj` 矩阵或表。",
|
|
7721
7800
|
"",
|
|
7722
|
-
"`row`
|
|
7801
|
+
"`row` 非负整数,表示行坐标。",
|
|
7723
7802
|
"",
|
|
7724
|
-
"`col`
|
|
7803
|
+
"`col` 非负整数,表示列坐标。"
|
|
7725
7804
|
]
|
|
7726
7805
|
}
|
|
7727
7806
|
]
|
|
@@ -7785,6 +7864,95 @@
|
|
|
7785
7864
|
}
|
|
7786
7865
|
]
|
|
7787
7866
|
},
|
|
7867
|
+
"cells": {
|
|
7868
|
+
"title": "cells",
|
|
7869
|
+
"type": "function",
|
|
7870
|
+
"children": [
|
|
7871
|
+
{
|
|
7872
|
+
"title": "语法",
|
|
7873
|
+
"type": "grammer",
|
|
7874
|
+
"children": [
|
|
7875
|
+
{
|
|
7876
|
+
"type": "text",
|
|
7877
|
+
"value": [
|
|
7878
|
+
"cells(obj, row, col)"
|
|
7879
|
+
]
|
|
7880
|
+
}
|
|
7881
|
+
]
|
|
7882
|
+
},
|
|
7883
|
+
{
|
|
7884
|
+
"title": "参数",
|
|
7885
|
+
"type": "parameters",
|
|
7886
|
+
"children": [
|
|
7887
|
+
{
|
|
7888
|
+
"type": "text",
|
|
7889
|
+
"value": [
|
|
7890
|
+
"`obj` 矩阵。",
|
|
7891
|
+
"",
|
|
7892
|
+
"`row` 整型向量,表示行坐标。",
|
|
7893
|
+
"",
|
|
7894
|
+
"`col` 与 row 等长的整型向量,表示列坐标。"
|
|
7895
|
+
]
|
|
7896
|
+
}
|
|
7897
|
+
]
|
|
7898
|
+
},
|
|
7899
|
+
{
|
|
7900
|
+
"title": "详情",
|
|
7901
|
+
"type": "detail",
|
|
7902
|
+
"children": [
|
|
7903
|
+
{
|
|
7904
|
+
"type": "text",
|
|
7905
|
+
"value": [
|
|
7906
|
+
"返回一个由矩阵中 row 和 col 定位的元素组成的向量。"
|
|
7907
|
+
]
|
|
7908
|
+
}
|
|
7909
|
+
]
|
|
7910
|
+
},
|
|
7911
|
+
{
|
|
7912
|
+
"title": "例子",
|
|
7913
|
+
"type": "example",
|
|
7914
|
+
"children": [
|
|
7915
|
+
{
|
|
7916
|
+
"type": "code",
|
|
7917
|
+
"language": "console",
|
|
7918
|
+
"value": [
|
|
7919
|
+
"",
|
|
7920
|
+
" $ m=(1..15).reshape(3:5)",
|
|
7921
|
+
" $ m;",
|
|
7922
|
+
""
|
|
7923
|
+
]
|
|
7924
|
+
},
|
|
7925
|
+
{
|
|
7926
|
+
"type": "text",
|
|
7927
|
+
"value": [
|
|
7928
|
+
"===== ===== ===== ===== =====",
|
|
7929
|
+
"col1 col2 col3 col4 col5",
|
|
7930
|
+
"===== ===== ===== ===== =====",
|
|
7931
|
+
"1 4 7 10 13",
|
|
7932
|
+
"2 5 8 11 14",
|
|
7933
|
+
"3 6 9 12 15",
|
|
7934
|
+
"===== ===== ===== ===== =====",
|
|
7935
|
+
""
|
|
7936
|
+
]
|
|
7937
|
+
},
|
|
7938
|
+
{
|
|
7939
|
+
"type": "code",
|
|
7940
|
+
"language": "console",
|
|
7941
|
+
"value": [
|
|
7942
|
+
"",
|
|
7943
|
+
" // 取矩阵中下标为 [0,1] 和 [0,2] 两个元素",
|
|
7944
|
+
" $ cells(m, 0 0, 1 2)",
|
|
7945
|
+
" [4,7]",
|
|
7946
|
+
" // 取矩阵对角线上的元素",
|
|
7947
|
+
" $ index = 0..2",
|
|
7948
|
+
" $ cells(m, v, v)",
|
|
7949
|
+
" [1, 5, 9]"
|
|
7950
|
+
]
|
|
7951
|
+
}
|
|
7952
|
+
]
|
|
7953
|
+
}
|
|
7954
|
+
]
|
|
7955
|
+
},
|
|
7788
7956
|
"changePwd": {
|
|
7789
7957
|
"title": "changePwd",
|
|
7790
7958
|
"type": "command",
|
|
@@ -7808,9 +7976,9 @@
|
|
|
7808
7976
|
{
|
|
7809
7977
|
"type": "text",
|
|
7810
7978
|
"value": [
|
|
7811
|
-
"`oldPwd`
|
|
7979
|
+
"`oldPwd` 表示用户旧密码的字符串。",
|
|
7812
7980
|
"",
|
|
7813
|
-
"`newPwd`
|
|
7981
|
+
"`newPwd` 表示用户新密码的字符串,长度范围为 6~20 个字符。"
|
|
7814
7982
|
]
|
|
7815
7983
|
}
|
|
7816
7984
|
]
|
|
@@ -11375,7 +11543,7 @@
|
|
|
11375
11543
|
"",
|
|
11376
11544
|
"为了便于观察和对比计算结果,系统会对第一个数据窗口的起始时间进行调整。调整规则与 :doc:`createTimeSeriesEngine` 相同。",
|
|
11377
11545
|
"",
|
|
11378
|
-
"`garbageSize` 是正整数。它是可选参数,默认值是2,000
|
|
11546
|
+
"`garbageSize` 是正整数。它是可选参数,默认值是2,000(单位为行)。如果没有指定 *keyColumn*,当内存中历史数据的数量超过 *garbageSize* 时,系统会清理本次计算不需要的历史数据。如果指定了 *keyColumn*,意味着需要分组计算时,内存清理是各分组独立进行的。当一个组的历史数据记录数超出 *garbageSize* 时,会清理该组不再需要的历史数据。若一个组的历史数据记录数未超出 *garbageSize*,则该组数据不会被清理。如果 *metrics* 中没有聚合函数,这个参数不起作用。",
|
|
11379
11547
|
"",
|
|
11380
11548
|
"若要开启快照机制 (snapshot),必须指定 *snapshotDir* 与 *snapshotIntervalInMsgCount*。",
|
|
11381
11549
|
"",
|
|
@@ -11558,7 +11726,7 @@
|
|
|
11558
11726
|
"",
|
|
11559
11727
|
"\\1. 只有一个连接列:当左表和右表的连接列名相同时,*matchingColumn* 是一个字符串标量,否则是一个长度为 2 的 tuple,例如:左表连接列名为 sym,右表连接列名为 sym1,则 *matchingColumn* = [[\\`sym],[\\`sym1]]。",
|
|
11560
11728
|
"",
|
|
11561
|
-
"\\2. 有多个连接列:当左表和右表的连接列名相同时,*matchingColumn* 是一个字符串向量,否则是一个长度为 2 的 tuple,例如:左表连接列名为
|
|
11729
|
+
"\\2. 有多个连接列:当左表和右表的连接列名相同时,*matchingColumn* 是一个字符串向量,否则是一个长度为 2 的 tuple,例如:左表连接列名为 orderNo, sym,右表连接列名为 orderNo, sym1,则 *matchingColumn* = [[\\`orderNo, \\`sym], [\\`orderNo,\\`sym1]]。",
|
|
11562
11730
|
"",
|
|
11563
11731
|
"`timeColumn` 可选参数,当 *useSystemTime* = false 时,指定要连接的两个表中时间列的名称。 `leftTable` 和 `rightTable` 时间列名称可以不同,但数据类型需保持一致。当 `leftTable` 和 `rightTable` 时间列名称不同时,`timeColumn` 为一个长度为2的字符串向量。",
|
|
11564
11732
|
"",
|
|
@@ -11572,7 +11740,7 @@
|
|
|
11572
11740
|
"",
|
|
11573
11741
|
"如果指定了 *delayedTime*,若左表中最新时间 t2 与上一条未计算的时间差大于 *delayedTime* 设置值,则 t2 这条记录可以直接触发左表和右表 join,或者左表中的数据在经过 2 * *delayedTime* (小于2秒按2秒计算)后还没有 join 输出,则直接触发 join。",
|
|
11574
11742
|
"",
|
|
11575
|
-
"`garbageSize` 可选参数,是正整数,默认值是5,000
|
|
11743
|
+
"`garbageSize` 可选参数,是正整数,默认值是5,000(单位为行)。随着订阅的流数据不断注入 asof join 引擎,存放在内存中的数据会越来越多,行数超过 *garbageSize* 值时,系统会清理本次计算不需要的历史数据。"
|
|
11576
11744
|
]
|
|
11577
11745
|
}
|
|
11578
11746
|
]
|
|
@@ -11981,7 +12149,8 @@
|
|
|
11981
12149
|
{
|
|
11982
12150
|
"type": "text",
|
|
11983
12151
|
"value": [
|
|
11984
|
-
"createDailyTimeSeriesEngine(name, windowSize, step, metrics, dummyTable, outputTable, [timeColumn], [useSystemTime=false], [keyColumn], [garbageSize], [updateTime], [useWindowStartTime], [roundTime=true], [snapshotDir], [snapshotIntervalInMsgCount], [fill='none'], [sessionBegin], [sessionEnd], [mergeSessionEnd=false], [forceTriggerTime], [raftGroup], [forceTriggerSessionEndTime])"
|
|
12152
|
+
"createDailyTimeSeriesEngine(name, windowSize, step, metrics, dummyTable, outputTable, [timeColumn], [useSystemTime=false], [keyColumn], [garbageSize], [updateTime], [useWindowStartTime], [roundTime=true], [snapshotDir], [snapshotIntervalInMsgCount], [fill='none'], [sessionBegin], [sessionEnd], [mergeSessionEnd=false], [forceTriggerTime], [raftGroup], [forceTriggerSessionEndTime], [keyPurgeFreqInSec], [closed='left'])",
|
|
12153
|
+
" "
|
|
11985
12154
|
]
|
|
11986
12155
|
}
|
|
11987
12156
|
]
|
|
@@ -12141,6 +12310,183 @@
|
|
|
12141
12310
|
}
|
|
12142
12311
|
]
|
|
12143
12312
|
},
|
|
12313
|
+
"createDistributedInMemoryTable": {
|
|
12314
|
+
"title": "createDistributedInMemoryTable",
|
|
12315
|
+
"type": "function",
|
|
12316
|
+
"children": [
|
|
12317
|
+
{
|
|
12318
|
+
"title": "语法",
|
|
12319
|
+
"type": "grammer",
|
|
12320
|
+
"children": [
|
|
12321
|
+
{
|
|
12322
|
+
"type": "text",
|
|
12323
|
+
"value": [
|
|
12324
|
+
"createDistributedInMemoryTable(tableName, colNames, colTypes, globalPartitionType, globalPartitionScheme, globalPartitionColumn, [localPartitionType], [localPartitionScheme], [localPartitionColumn])",
|
|
12325
|
+
" "
|
|
12326
|
+
]
|
|
12327
|
+
}
|
|
12328
|
+
]
|
|
12329
|
+
},
|
|
12330
|
+
{
|
|
12331
|
+
"title": "详情",
|
|
12332
|
+
"type": "detail",
|
|
12333
|
+
"children": [
|
|
12334
|
+
{
|
|
12335
|
+
"type": "text",
|
|
12336
|
+
"value": [
|
|
12337
|
+
"创建一个分布式共享内存表,按指定分区方案,将数据存储在不同在节点上。该函数只能在数据节点/计算节点执行。",
|
|
12338
|
+
"",
|
|
12339
|
+
"按全局分区方案将分布式共享内存表的数据分散地存储在不同节点(数据节点/计算节点)的内存中。每个节点最多只能存放一个分区的数据。分布式共享内存表支持并行读写,因此,它适用于需要对内存表进行分布式计算的场景。",
|
|
12340
|
+
"",
|
|
12341
|
+
"分布式共享内存表的分区分为两级:",
|
|
12342
|
+
"",
|
|
12343
|
+
"* 第一级为全局分区。全局分区可以将内存表的数据按照分区存放在不同的节点上。",
|
|
12344
|
+
"* 第二级为局部分区(可选配置)。局部分区对存储在单个节点内的分区数据进行再分区。",
|
|
12345
|
+
"",
|
|
12346
|
+
"若同时配置了全局分区和局部分区,等同于对分布式共享内存表进行了组合分区。",
|
|
12347
|
+
"",
|
|
12348
|
+
"注意:",
|
|
12349
|
+
"",
|
|
12350
|
+
"\\(1) 仅支持在集群模式下创建分布式共享内存表。",
|
|
12351
|
+
"",
|
|
12352
|
+
"\\(2) 全局分区的数量必须不小于2,且不能超过数据节点和计算节点总数。",
|
|
12353
|
+
"",
|
|
12354
|
+
"\\(3) 其它节点访问分布式共享内存表前,需要执行 :doc:`../l/loadDistributedInMemoryTable` 函数加载表。",
|
|
12355
|
+
"",
|
|
12356
|
+
"\\(4) 通过命令 :doc:`/FunctionsandCommands/CommandsReferences/d/dropDistributedInMemoryTable` 删除分布式共享内存表。",
|
|
12357
|
+
"",
|
|
12358
|
+
"\\(5) 分布式共享内存表的操作暂不支持事务。"
|
|
12359
|
+
]
|
|
12360
|
+
}
|
|
12361
|
+
]
|
|
12362
|
+
},
|
|
12363
|
+
{
|
|
12364
|
+
"title": "参数",
|
|
12365
|
+
"type": "parameters",
|
|
12366
|
+
"children": [
|
|
12367
|
+
{
|
|
12368
|
+
"type": "text",
|
|
12369
|
+
"value": [
|
|
12370
|
+
"`tableName` 字符串标量,表示分布式共享内存表的名称。",
|
|
12371
|
+
"",
|
|
12372
|
+
"`colNames` 字符串向量,用于指定表的列名。",
|
|
12373
|
+
"",
|
|
12374
|
+
"`colTypes` 由数据类型组成的向量,用于指定 *colNames* 各列的类型。",
|
|
12375
|
+
"",
|
|
12376
|
+
"`globalPartitionType` 必选参数,表示集群全局的分区类型,仅支持范围分区(RANGE),哈希分区(HASH),数值分区(VALUE),列表分区(LIST)。",
|
|
12377
|
+
"",
|
|
12378
|
+
"`globalPartitionScheme` 必选参数,表示集群全局的分区方案。",
|
|
12379
|
+
"",
|
|
12380
|
+
"分区类型及对应的分区方案见下表:",
|
|
12381
|
+
"",
|
|
12382
|
+
"+--------+--------+------------------------------------------------------------+",
|
|
12383
|
+
"|分区类型|分区符号|分区方案 |",
|
|
12384
|
+
"+========+========+============================================================+",
|
|
12385
|
+
"|范围分区|RANGE |向量。向量的任意两个相邻元素定义分区的范围。 |",
|
|
12386
|
+
"+--------+--------+------------------------------------------------------------+",
|
|
12387
|
+
"|哈希分区|HASH |元组。第一个元素是分区列的数据类型,第二个元素是分区的数量。|",
|
|
12388
|
+
"+--------+--------+------------------------------------------------------------+",
|
|
12389
|
+
"|值分区 |VALUE |向量。向量的每个元素定义了一个分区。 |",
|
|
12390
|
+
"+--------+--------+------------------------------------------------------------+",
|
|
12391
|
+
"|列表分区|LIST |向量。向量的每个元素定义了一个分区。 |",
|
|
12392
|
+
"+--------+--------+------------------------------------------------------------+",
|
|
12393
|
+
"",
|
|
12394
|
+
"`globalPartitionColumn` 必选参数,字符串标量,表示集群全局的分区列。",
|
|
12395
|
+
"",
|
|
12396
|
+
"以上参数对应整个集群的分区配置,分布式共享内存表将按照上述分区方案将数据分区后存储到各个节点。各个节点的数据可以通过以下参数,进行节点内部的二次分区。",
|
|
12397
|
+
"",
|
|
12398
|
+
"`localPartitionType` 可选参数,表示节点内部的分区类型,仅支持范围分区(RANGE),哈希分区(HASH),数值分区(VALUE),列表分区(LIST)。",
|
|
12399
|
+
"",
|
|
12400
|
+
"`localPartitionScheme` 可选参数,表示节点内部的分区方案。",
|
|
12401
|
+
"",
|
|
12402
|
+
"`localPartitionColumn` 可选参数,字符串标量,表示节点内部的分区列。"
|
|
12403
|
+
]
|
|
12404
|
+
}
|
|
12405
|
+
]
|
|
12406
|
+
},
|
|
12407
|
+
{
|
|
12408
|
+
"title": "例子",
|
|
12409
|
+
"type": "example",
|
|
12410
|
+
"children": [
|
|
12411
|
+
{
|
|
12412
|
+
"type": "text",
|
|
12413
|
+
"value": [
|
|
12414
|
+
"* 创建分布式共享内存表",
|
|
12415
|
+
"",
|
|
12416
|
+
"本例的集群拥有两个数据节点 node1 和 node2,在 node1 上创建一个分布式共享内存表。因为分区的数量不能超过数据节点和计算节点数总和,建议进行 HASH 分区。",
|
|
12417
|
+
""
|
|
12418
|
+
]
|
|
12419
|
+
},
|
|
12420
|
+
{
|
|
12421
|
+
"type": "code",
|
|
12422
|
+
"language": "console",
|
|
12423
|
+
"value": [
|
|
12424
|
+
"",
|
|
12425
|
+
" $ pt = createDistributedInMemoryTable(`dt, `time`id`value, `DATETIME`INT`LONG, HASH, [INT, 2],`id)",
|
|
12426
|
+
""
|
|
12427
|
+
]
|
|
12428
|
+
},
|
|
12429
|
+
{
|
|
12430
|
+
"type": "text",
|
|
12431
|
+
"value": [
|
|
12432
|
+
"* 加载分布式共享内存表",
|
|
12433
|
+
"",
|
|
12434
|
+
"在 node2 上加载分布式共享内存表,并插入数据。",
|
|
12435
|
+
""
|
|
12436
|
+
]
|
|
12437
|
+
},
|
|
12438
|
+
{
|
|
12439
|
+
"type": "code",
|
|
12440
|
+
"language": "console",
|
|
12441
|
+
"value": [
|
|
12442
|
+
"",
|
|
12443
|
+
" $ time = take(2021.08.20 00:00:00..2021.08.30 00:00:00, 40);",
|
|
12444
|
+
" $ id = 0..39;",
|
|
12445
|
+
" $ value = rand(100, 40);",
|
|
12446
|
+
" $ tmp = table(time, id, value);",
|
|
12447
|
+
"",
|
|
12448
|
+
" $ pt = loadDistributedInMemoryTable(`dt)",
|
|
12449
|
+
" $ pt.append!(tmp);",
|
|
12450
|
+
"",
|
|
12451
|
+
" $ select * from pt;",
|
|
12452
|
+
""
|
|
12453
|
+
]
|
|
12454
|
+
},
|
|
12455
|
+
{
|
|
12456
|
+
"type": "text",
|
|
12457
|
+
"value": [
|
|
12458
|
+
"* 查看分布式共享内存表是否存在。",
|
|
12459
|
+
""
|
|
12460
|
+
]
|
|
12461
|
+
},
|
|
12462
|
+
{
|
|
12463
|
+
"type": "code",
|
|
12464
|
+
"language": "console",
|
|
12465
|
+
"value": [
|
|
12466
|
+
"",
|
|
12467
|
+
" $ objs(true)",
|
|
12468
|
+
""
|
|
12469
|
+
]
|
|
12470
|
+
},
|
|
12471
|
+
{
|
|
12472
|
+
"type": "text",
|
|
12473
|
+
"value": [
|
|
12474
|
+
"* 删除分布式共享内存表",
|
|
12475
|
+
""
|
|
12476
|
+
]
|
|
12477
|
+
},
|
|
12478
|
+
{
|
|
12479
|
+
"type": "code",
|
|
12480
|
+
"language": "console",
|
|
12481
|
+
"value": [
|
|
12482
|
+
"",
|
|
12483
|
+
" $ dropDistributedInMemoryTable(`dt)"
|
|
12484
|
+
]
|
|
12485
|
+
}
|
|
12486
|
+
]
|
|
12487
|
+
}
|
|
12488
|
+
]
|
|
12489
|
+
},
|
|
12144
12490
|
"createEqualJoinEngine": {
|
|
12145
12491
|
"title": "createEqualJoinEngine",
|
|
12146
12492
|
"type": "function",
|
|
@@ -12168,7 +12514,7 @@
|
|
|
12168
12514
|
"",
|
|
12169
12515
|
"`name` 必选参数,是一个字符串,表示流数据 equal join 引擎的名称。",
|
|
12170
12516
|
"",
|
|
12171
|
-
"`garbageSize` 可选参数,是正整数,默认值是5,000
|
|
12517
|
+
"`garbageSize` 可选参数,是正整数,默认值是5,000(单位为行)。当内存中历史数据行数超过 *garbageSize* 时,会清理本次计算不需要的历史数据。",
|
|
12172
12518
|
"",
|
|
12173
12519
|
"`maxDelayedTime` 可选参数,为正整数,默认值为3s,equal join 引擎接收到的能够参与计算的数据的最大延时时间。超过 *maxDelayedTime* 延迟时间的数据会被丢弃。不建议 *maxDelayedTime* 值设置过小。",
|
|
12174
12520
|
"",
|
|
@@ -12666,15 +13012,15 @@
|
|
|
12666
13012
|
{
|
|
12667
13013
|
"type": "text",
|
|
12668
13014
|
"value": [
|
|
12669
|
-
"`dbHandle`
|
|
13015
|
+
"`dbHandle` :doc:`../d/database` 函数返回的数据库句柄。它可以是本地磁盘数据库,也可以是分布式数据库。*dbHandle* 为空字符串或没有指定时,表示内存数据库的句柄。",
|
|
12670
13016
|
"",
|
|
12671
|
-
"`table`
|
|
13017
|
+
"`table` 一个表或包含多个表的元组。系统将会根据该表的结构创建新的分区表。",
|
|
12672
13018
|
"",
|
|
12673
|
-
"`tableName`
|
|
13019
|
+
"`tableName` 一个字符串,表示的分区表的名称。",
|
|
12674
13020
|
"",
|
|
12675
|
-
"`partitionColumns`
|
|
13021
|
+
"`partitionColumns` 一个字符串或字符串向量,表示分区列。对于组合分区,partitionColumns 是一个字符串向量。对非顺序分区,此参数为必选参数。",
|
|
12676
13022
|
"",
|
|
12677
|
-
"`compressMethods`
|
|
13023
|
+
"`compressMethods` 一个字典,指定某些列使用 lz4 或者 delta 压缩算法存储。key 为字段名,value 为压缩算法(\"lz4\" 或 \"delta\")。若未指定,默认采用 lz4 压缩算法。请注意,delta 算法仅可用于 SHORT, INT, LONG 与时间或日期类型数据。"
|
|
12678
13024
|
]
|
|
12679
13025
|
}
|
|
12680
13026
|
]
|
|
@@ -12958,11 +13304,11 @@
|
|
|
12958
13304
|
"",
|
|
12959
13305
|
"下列状态函数在 DolphinDB 的响应式状态引擎中的实现均得到了优化。目前,状态引擎不允许使用未经优化的状态函数。应避免使用聚合函数。",
|
|
12960
13306
|
"",
|
|
12961
|
-
"* 累计窗口函数:cumavg, cumsum, cumprod, cumcount, cummin, cummax, cumvar, cumvarp, cumstd, cumstdp, cumcorr, cumcovar, cumbeta, cumwsum, cumwavg, cumfirstNot, cumlastNot",
|
|
13307
|
+
"* 累计窗口函数:cumavg, cumsum, cumprod, cumcount, cummin, cummax, cumvar, cumvarp, cumstd, cumstdp, cumcorr, cumcovar, cumbeta, cumwsum, cumwavg, cumfirstNot, cumlastNot, cummed, cumpercentile ",
|
|
12962
13308
|
"* 滑动窗口函数:ema, mavg, msum, mcount, mprod, mvar, mvarp, mstd, mstdp, mskew, mkurtosis, mmin, mmax, mimin, mimax, mmed, mpercentile, mrank, mcorr, mcovar, mbeta, mwsum, mwavg, mmad, mfirst, mlast, mslr, tmove, tmfirst, tmlast, tmsum, tmavg, tmcount, tmvar, tmvarp, tmstd, tmstdp, tmprod, tmskew, tmkurtosis, tmmin, tmmax, tmmed, tmpercentile, tmrank, tmcovar, tmbeta, tmcorr, tmwavg, tmwsum, tmoving, moving, sma,wma, dema, tema, trima, linearTimeTrend, talib, t3, ma",
|
|
12963
13309
|
"* 序列相关函数:deltas, ratios, ffill, move, prev, iterate, ewmMean, ewmVar, ewmStd, ewmCov, ewmCorr",
|
|
12964
13310
|
"* topN相关函数:msumTopN, mavgTopN, mstdpTopN, mstdTopN, mvarpTopN, mvarTopN, mcorrTopN, mbetaTopN, mcovarTopN, mwsumTopN",
|
|
12965
|
-
"* 其他函数:talibNull",
|
|
13311
|
+
"* 其他函数:talibNull, dynamicGroupCumsum, dynamicGroupCumcount",
|
|
12966
13312
|
"",
|
|
12967
13313
|
"注意,:doc:`/Functionalprogramming/TemplateFunctions/talib` 作为状态函数时,第一个参数 `func` 只能是响应式状态引擎支持的状态函数。",
|
|
12968
13314
|
"",
|
|
@@ -13005,17 +13351,19 @@
|
|
|
13005
13351
|
"",
|
|
13006
13352
|
"`keyPurgeFilter` 可选参数,是一个由条件表达式组成的元代码,表示清理条件。各表达式只能引用 *outputTable* 中的字段。",
|
|
13007
13353
|
"",
|
|
13008
|
-
"`keyPurgeFreqInSecond`
|
|
13354
|
+
"`keyPurgeFreqInSecond` 正整数,表示触发数据清理需要满足的时间间隔(以秒为单位)。",
|
|
13009
13355
|
"",
|
|
13010
|
-
"
|
|
13356
|
+
"响应式状态引擎提供了 *keyPurgeFilter*, *keyPurgeFreqInSecond* 两个参数,用来清理不再需要的分组数据。",
|
|
13011
13357
|
"",
|
|
13012
|
-
"
|
|
13358
|
+
"每次数据注入时,系统会依次根据以下条件决定是否触发数据清理:",
|
|
13013
13359
|
"",
|
|
13014
|
-
"\\
|
|
13360
|
+
"\\(1) 检测本次数据注入与上一次数据注入的时间间隔是否大于等于 keyPurgeFreqInSecond(第一次数据注入时,检测注入时间和引擎创建时间的间隔);",
|
|
13015
13361
|
"",
|
|
13016
|
-
"\\
|
|
13362
|
+
"\\(2) 若满足上述条件,系统将根据 keyPurgeFilter 指定的条件,过滤出待清理的数据;",
|
|
13363
|
+
"",
|
|
13364
|
+
"\\(3) 若待清理的数据所属的分组数大于等于所有分组数的 10%,则触发清理。",
|
|
13017
13365
|
" ",
|
|
13018
|
-
"
|
|
13366
|
+
"若需要查看清理前后的状态,可以通过调用 :doc:`../g/getStreamEngineStat` 函数查看 ReactiveStreamEngine 引擎状态的 numGroups 列,来对比响应式状态引擎清理前后分组数的变化。",
|
|
13019
13367
|
"",
|
|
13020
13368
|
"`raftGroup` 是流数据高可用订阅端 raft 组的 ID (大于1的整数,由流数据高可用相关的配置项 *streamingRaftGroups* 指定)。设置该参数表示开启计算引擎高可用。在 leader 节点创建流数据引擎后,会同步在 follower 节点创建该引擎。每次保存的 snapshot 也会同步到 follower。当 raft 组的 leader 节点宕机时,会自动切换新 leader 节点重新订阅流数据表。请注意,若要指定 *raftGroup*,必须同时指定 *snapshotDir*。"
|
|
13021
13369
|
]
|
|
@@ -13152,7 +13500,7 @@
|
|
|
13152
13500
|
"",
|
|
13153
13501
|
"* 当 *useSystemTime* = false(缺省值)时,根据 *timeColumn* 列中数据来决定数据窗口。",
|
|
13154
13502
|
"",
|
|
13155
|
-
"`useSessionStartTime`:
|
|
13503
|
+
"`useSessionStartTime`: 可选参数,是一个布尔值,默认值为 true,表示输出表中的时刻是否为数据窗口起始时刻,即每个窗口中第一条数据的时刻。若设置为 false,则表示输出表中的时刻为数据窗口结束时刻,即每个窗口中最后一条数据的时刻+ *sessionGap*。如果指定 *updateTime*,*useSessionStartTime* 必须为 true。"
|
|
13156
13504
|
]
|
|
13157
13505
|
}
|
|
13158
13506
|
]
|
|
@@ -13280,13 +13628,13 @@
|
|
|
13280
13628
|
{
|
|
13281
13629
|
"type": "text",
|
|
13282
13630
|
"value": [
|
|
13283
|
-
"`dbHandle`
|
|
13631
|
+
"`dbHandle` :doc:`../d/database` 函数返回的分布式数据库句柄。",
|
|
13284
13632
|
"",
|
|
13285
|
-
"`table`
|
|
13633
|
+
"`table` 一个表,系统将根据该表的结构在数据库中创建一个空的维度表。",
|
|
13286
13634
|
"",
|
|
13287
|
-
"`tableName`
|
|
13635
|
+
"`tableName` 一个字符串,表示维度表的名称。",
|
|
13288
13636
|
"",
|
|
13289
|
-
"`compressMethods`
|
|
13637
|
+
"`compressMethods` 一个字典,指定某些列使用 lz4 或者 delta 压缩算法存储。key 为字段名,value 为压缩算法(\"lz4\"或\"delta\")。若未指定,默认采用lz4压缩算法。请注意,delta 算法仅可用于 SHORT, INT, LONG 与时间或日期类型数据。"
|
|
13290
13638
|
]
|
|
13291
13639
|
}
|
|
13292
13640
|
]
|
|
@@ -13397,7 +13745,7 @@
|
|
|
13397
13745
|
{
|
|
13398
13746
|
"type": "text",
|
|
13399
13747
|
"value": [
|
|
13400
|
-
"createTimeSeriesEngine(name, windowSize, step, metrics, dummyTable, outputTable, [timeColumn], [useSystemTime=false], [keyColumn], [garbageSize], [updateTime], [useWindowStartTime=false], [roundTime=true], [snapshotDir], [snapshotIntervalInMsgCount], [fill='none'], [forceTriggerTime], [raftGroup])",
|
|
13748
|
+
"createTimeSeriesEngine(name, windowSize, step, metrics, dummyTable, outputTable, [timeColumn], [useSystemTime=false], [keyColumn], [garbageSize], [updateTime], [useWindowStartTime=false], [roundTime=true], [snapshotDir], [snapshotIntervalInMsgCount], [fill='none'], [forceTriggerTime], [raftGroup], [keyPurgeFreqInSec], [closed='left'])",
|
|
13401
13749
|
"",
|
|
13402
13750
|
"别名:createTimeSeriesAggregator"
|
|
13403
13751
|
]
|
|
@@ -13443,7 +13791,7 @@
|
|
|
13443
13791
|
"",
|
|
13444
13792
|
"例如,一个数据窗口从10:10:10到10:10:19。若 *useSystemTime* = true,则只要该窗口中至少有一条数据,该窗口的计算会在窗口结束后的10:10:20触发。若 *useSystemTime* = false,且10:10:19后的第一条数据为10:10:25,则该窗口的计算会在10:10:25触发。",
|
|
13445
13793
|
"",
|
|
13446
|
-
"`windowSize` 必选参数,是一个正整数标量或向量,指定数据窗口的长度。若为向量,其长度必须与 *metrics*
|
|
13794
|
+
"`windowSize` 必选参数,是一个正整数标量或向量,指定数据窗口的长度。若为向量,其长度必须与 *metrics* 中元素个数一致。",
|
|
13447
13795
|
"",
|
|
13448
13796
|
"`step` 必选参数,是一个正整数,表示计算窗口右边界的位移量。 *windowSize* 必须是 *step* 的整数倍,否则会抛出异常。",
|
|
13449
13797
|
"",
|
|
@@ -13608,7 +13956,7 @@
|
|
|
13608
13956
|
"",
|
|
13609
13957
|
"`keyColumn` 可选参数,是字符串标量或向量,表示分组列名。若设置,则分组进行聚合计算,例如以每支股票为一组进行聚合计算。",
|
|
13610
13958
|
"",
|
|
13611
|
-
"`garbageSize` 可选参数,是正整数,默认值是50,000
|
|
13959
|
+
"`garbageSize` 可选参数,是正整数,默认值是50,000(单位为行)。当 *metrics* 中使用了自定义聚合函数,时间序列引擎会保留历史数据。随着订阅的流数据不断积累,进入时间序列引擎,存放在内存中的数据会越来越多,这时需要清理不再需要的历史数据。当内存中历史数据行数超过 *garbageSize* 值时,系统会清理本次计算不需要的历史数据。如果指定了 *keyColumn*,内存清理是各组内独立进行的。当一个组在内存中的历史数据记录数超出 *garbageSize* 时,会清理该组中本次计算中不需要的历史数据。",
|
|
13612
13960
|
"",
|
|
13613
13961
|
"`updateTime` 可选参数,是正整数,可定义比 *step* 更短的计算的时间间隔。*step* 必须是 *updateTime* 的整数倍。要设置 *updateTime*, *useSystemTime* 必须设为 false。",
|
|
13614
13962
|
"",
|
|
@@ -13656,7 +14004,7 @@
|
|
|
13656
14004
|
"",
|
|
13657
14005
|
"*fill* 可以输入向量,为每个 *metrics* 指定不同的 *fill* 方式。其中,向量中各项只能是 'null', 'ffill' 或一个数值,不能是 'none'。",
|
|
13658
14006
|
"",
|
|
13659
|
-
"`forceTriggerTime`
|
|
14007
|
+
"`forceTriggerTime` 可选参数,是非负整数,单位与 *timeColumn* 的时间精度一致。用于强制触发各个分组未计算的窗口进行计算。强制触发计算及输出规则如下:",
|
|
13660
14008
|
"",
|
|
13661
14009
|
"\\1. 未被触发计算的窗口结束后(窗口结束时刻为 t),若收到了其他分组的数据(时间戳为 t1),且满足 t1-t ≥ *forceTriggerTime*,则该窗口将被触发计算。",
|
|
13662
14010
|
"",
|
|
@@ -13668,7 +14016,26 @@
|
|
|
13668
14016
|
"",
|
|
13669
14017
|
"* 只设置 *updateTime*,计算发生后仍有属于当前窗口的数据到达时,当前窗口计算结果会再次更新;只设置 *forceTriggerTime*,则触发计算之后收到的数据会被丢弃。",
|
|
13670
14018
|
"",
|
|
13671
|
-
"`raftGroup` 是流数据高可用订阅端 raft 组的 ID (大于1的整数,由流数据高可用相关的配置项 *streamingRaftGroups* 指定)。设置该参数表示开启计算引擎高可用。在 leader 节点创建流数据引擎后,会同步在 follower 节点创建该引擎。每次保存的 snapshot 也会同步到 follower。当 raft 组的 leader 节点宕机时,会自动切换新 leader 节点重新订阅流数据表。请注意,若要指定 *raftGroup*,必须同时指定 *snapshotDir*。"
|
|
14019
|
+
"`raftGroup` 是流数据高可用订阅端 raft 组的 ID (大于1的整数,由流数据高可用相关的配置项 *streamingRaftGroups* 指定)。设置该参数表示开启计算引擎高可用。在 leader 节点创建流数据引擎后,会同步在 follower 节点创建该引擎。每次保存的 snapshot 也会同步到 follower。当 raft 组的 leader 节点宕机时,会自动切换新 leader 节点重新订阅流数据表。请注意,若要指定 *raftGroup*,必须同时指定 *snapshotDir*。",
|
|
14020
|
+
"",
|
|
14021
|
+
"`keyPurgeFreqInSec` 正整数,表示清理窗口数据为空的分组的时间间隔,单位为秒。指定该参数后,若当前数据注入时间与上一次清理时间的间隔大于等于 *keyPurgeFreqInSec*,便会对当前窗口数据为空的分组进行清理。",
|
|
14022
|
+
"",
|
|
14023
|
+
".. 若不指定该参数,则表示不对分组数据进行清理。",
|
|
14024
|
+
"",
|
|
14025
|
+
"注意:若需指定该参数,必须指定 *forceTriggerTime*,且不能指定 *fill*。",
|
|
14026
|
+
"",
|
|
14027
|
+
"若需要查看清理前后的状态,可以通过调用 :doc:`../g/getStreamEngineStat` 函数查看 TimeSeriesEngine 引擎状态的 numGroups 列,来对比响应式状态引擎清理前后分组数的变化。",
|
|
14028
|
+
"",
|
|
14029
|
+
"`closed` 字符串,用于确定滑动窗口边界的开闭情况。可选值为 'left' 或 'right',默认值为 'left'。",
|
|
14030
|
+
"",
|
|
14031
|
+
"* closed = 'left': 窗口左闭右开",
|
|
14032
|
+
"* closed = 'right': 窗口左开右闭",
|
|
14033
|
+
"",
|
|
14034
|
+
".. `closed` 字符串,表示对滑动窗口进行计算时需要排除的点,可选值为 'left' 或 'right',默认值为 'left'。",
|
|
14035
|
+
"",
|
|
14036
|
+
".. * closed = 'left': 计算中将排除滑动窗口中的最后一个点",
|
|
14037
|
+
".. * closed = 'right': 计算中将排除滑动窗口中的第一个点",
|
|
14038
|
+
""
|
|
13672
14039
|
]
|
|
13673
14040
|
}
|
|
13674
14041
|
]
|
|
@@ -14055,7 +14422,7 @@
|
|
|
14055
14422
|
"",
|
|
14056
14423
|
"`useSystemTime` 可选参数,表示 *outputTable* 中第一列(时间列)为系统当前时间(*useSystemTime* = true)或左表的时间列(*useSystemTime* = false)。",
|
|
14057
14424
|
"",
|
|
14058
|
-
"`garbageSize` 可选参数,是正整数,默认值是5,000
|
|
14425
|
+
"`garbageSize` 可选参数,是正整数,默认值是5,000(单位为行)。随着订阅的流数据不断积累进入 window join 引擎,存放在内存中的数据会越来越多,这时需要清理不再需要的历史数据。当内存中历史数据行数超过 *garbageSize* 值时,系统会清理本次计算不需要的历史数据。",
|
|
14059
14426
|
"",
|
|
14060
14427
|
"`maxDelayedTime` 可选参数,是正整数,默认值为3,单位为秒。通过设置该参数,帮助触发引擎中长时间未输出的分组数据进行计算。"
|
|
14061
14428
|
]
|
|
@@ -14706,7 +15073,7 @@
|
|
|
14706
15073
|
{
|
|
14707
15074
|
"type": "text",
|
|
14708
15075
|
"value": [
|
|
14709
|
-
"
|
|
15076
|
+
"累积计算 *X* 和 *Y* 的协方差(covariance)。"
|
|
14710
15077
|
]
|
|
14711
15078
|
}
|
|
14712
15079
|
]
|
|
@@ -20881,9 +21248,9 @@
|
|
|
20881
21248
|
{
|
|
20882
21249
|
"type": "text",
|
|
20883
21250
|
"value": [
|
|
20884
|
-
"`table`
|
|
21251
|
+
"`table` 一个内存表。",
|
|
20885
21252
|
"",
|
|
20886
|
-
"`colNames`
|
|
21253
|
+
"`colNames` 表示列名的标量或向量。"
|
|
20887
21254
|
]
|
|
20888
21255
|
}
|
|
20889
21256
|
]
|
|
@@ -21085,6 +21452,77 @@
|
|
|
21085
21452
|
}
|
|
21086
21453
|
]
|
|
21087
21454
|
},
|
|
21455
|
+
"dropDistributedInMemoryTable": {
|
|
21456
|
+
"title": "dropDistributedInMemoryTable",
|
|
21457
|
+
"type": "command",
|
|
21458
|
+
"children": [
|
|
21459
|
+
{
|
|
21460
|
+
"title": "语法",
|
|
21461
|
+
"type": "grammer",
|
|
21462
|
+
"children": [
|
|
21463
|
+
{
|
|
21464
|
+
"type": "text",
|
|
21465
|
+
"value": [
|
|
21466
|
+
"dropDistributedInMemoryTable(tableName)"
|
|
21467
|
+
]
|
|
21468
|
+
}
|
|
21469
|
+
]
|
|
21470
|
+
},
|
|
21471
|
+
{
|
|
21472
|
+
"title": "参数",
|
|
21473
|
+
"type": "parameters",
|
|
21474
|
+
"children": [
|
|
21475
|
+
{
|
|
21476
|
+
"type": "text",
|
|
21477
|
+
"value": [
|
|
21478
|
+
"`tableName` 字符串标量,表示分布式共享内存表的名称。"
|
|
21479
|
+
]
|
|
21480
|
+
}
|
|
21481
|
+
]
|
|
21482
|
+
},
|
|
21483
|
+
{
|
|
21484
|
+
"title": "详情",
|
|
21485
|
+
"type": "detail",
|
|
21486
|
+
"children": [
|
|
21487
|
+
{
|
|
21488
|
+
"type": "text",
|
|
21489
|
+
"value": [
|
|
21490
|
+
"删除指定的表。该命令只能在数据节点/计算节点上执行。"
|
|
21491
|
+
]
|
|
21492
|
+
}
|
|
21493
|
+
]
|
|
21494
|
+
},
|
|
21495
|
+
{
|
|
21496
|
+
"title": "例子",
|
|
21497
|
+
"type": "example",
|
|
21498
|
+
"children": [
|
|
21499
|
+
{
|
|
21500
|
+
"type": "code",
|
|
21501
|
+
"language": "console",
|
|
21502
|
+
"value": [
|
|
21503
|
+
"",
|
|
21504
|
+
" $ pt = createDistributedInMemoryTable(`dt, `time`id`value, `DATETIME`INT`LONG, HASH, [INT, 2],`id)",
|
|
21505
|
+
" $ time = take(2021.08.20 00:00:00..2021.08.30 00:00:00, 40);",
|
|
21506
|
+
" $ id = 0..39;",
|
|
21507
|
+
" $ value = rand(100, 40);",
|
|
21508
|
+
" $ tmp = table(time, id, value);",
|
|
21509
|
+
"",
|
|
21510
|
+
" $ pt = loadDistributedInMemoryTable(`dt)",
|
|
21511
|
+
" $ pt.append!(tmp);",
|
|
21512
|
+
" $ dropDistributedInMemoryTable(`dt)",
|
|
21513
|
+
""
|
|
21514
|
+
]
|
|
21515
|
+
},
|
|
21516
|
+
{
|
|
21517
|
+
"type": "text",
|
|
21518
|
+
"value": [
|
|
21519
|
+
"相关函数::doc:`/FunctionsandCommands/FunctionReferences/l/loadDistributedInMemoryTable`, :doc:`/FunctionsandCommands/FunctionReferences/c/createDistributedInMemoryTable`"
|
|
21520
|
+
]
|
|
21521
|
+
}
|
|
21522
|
+
]
|
|
21523
|
+
}
|
|
21524
|
+
]
|
|
21525
|
+
},
|
|
21088
21526
|
"dropFunctionView": {
|
|
21089
21527
|
"title": "dropFunctionView",
|
|
21090
21528
|
"type": "command",
|
|
@@ -21155,13 +21593,13 @@
|
|
|
21155
21593
|
{
|
|
21156
21594
|
"type": "text",
|
|
21157
21595
|
"value": [
|
|
21158
|
-
"`dbHandle`
|
|
21596
|
+
"`dbHandle` 分布式数据库的句柄。",
|
|
21159
21597
|
"",
|
|
21160
21598
|
"`partitionPaths` 可为以 \"/\" 开头的字符串或这些字符串组成的元组,表示数据库目录下单个或多个分区的路径。请注意对组合分区,路径必须包括所有层次分区。*partitionPaths* 也可以是一个过滤条件或者多个过滤条件组成的元组,其中每个过滤条件是表示一个或多个分区的一个值或向量(向量中每个值代表一个分区)。多个过滤条件组成的元组是针对组合分区,每层分区对应过滤条件元组的一个元素。如果某层分区不需要过滤,那么相应的过滤条件为空。",
|
|
21161
21599
|
"",
|
|
21162
|
-
"`tableName`
|
|
21600
|
+
"`tableName` 一个字符串,表示表名。若分区粒度为数据库级(:doc:`/FunctionsandCommands/FunctionReferences/d/database`: *chunkGranularity* = 'DATABASE'),可以不指定 *tableName*,否则必须指定该参数。",
|
|
21163
21601
|
"",
|
|
21164
|
-
"`forceDelete`
|
|
21602
|
+
"`forceDelete` 一个布尔值。如果 *forceDelete* =true,即使指定的分区正在恢复,系统也会将其强制删除。默认值为 false。"
|
|
21165
21603
|
]
|
|
21166
21604
|
}
|
|
21167
21605
|
]
|
|
@@ -21585,7 +22023,7 @@
|
|
|
21585
22023
|
"value": [
|
|
21586
22024
|
"删除流数据表。如果流数据表启用了持久化,该函数也会将磁盘上持久化的数据删除。",
|
|
21587
22025
|
"",
|
|
21588
|
-
"如果要删除高可用流数据表,只需在Raft
|
|
22026
|
+
"如果要删除高可用流数据表,只需在Raft组中的任意一个数据节点/计算节点上执行该函数即可,其他数据节点/计算节点上名称相同的高可用流数据表也会被删除。"
|
|
21589
22027
|
]
|
|
21590
22028
|
}
|
|
21591
22029
|
]
|
|
@@ -21684,7 +22122,7 @@
|
|
|
21684
22122
|
{
|
|
21685
22123
|
"type": "text",
|
|
21686
22124
|
"value": [
|
|
21687
|
-
"
|
|
22125
|
+
"删除指定的表。该命令只能在数据节点/计算节点上执行,不能在控制节点和代理节点上执行。"
|
|
21688
22126
|
]
|
|
21689
22127
|
}
|
|
21690
22128
|
]
|
|
@@ -22020,6 +22458,372 @@
|
|
|
22020
22458
|
}
|
|
22021
22459
|
]
|
|
22022
22460
|
},
|
|
22461
|
+
"dynamicGroupCumcount": {
|
|
22462
|
+
"title": "dynamicGroupCumcount",
|
|
22463
|
+
"type": "function",
|
|
22464
|
+
"children": [
|
|
22465
|
+
{
|
|
22466
|
+
"title": "语法",
|
|
22467
|
+
"type": "grammer",
|
|
22468
|
+
"children": [
|
|
22469
|
+
{
|
|
22470
|
+
"type": "text",
|
|
22471
|
+
"value": [
|
|
22472
|
+
"dynamicGroupCumcount(membership, prevMembership, groupCount)"
|
|
22473
|
+
]
|
|
22474
|
+
}
|
|
22475
|
+
]
|
|
22476
|
+
},
|
|
22477
|
+
{
|
|
22478
|
+
"title": "参数",
|
|
22479
|
+
"type": "parameters",
|
|
22480
|
+
"children": [
|
|
22481
|
+
{
|
|
22482
|
+
"type": "text",
|
|
22483
|
+
"value": [
|
|
22484
|
+
"`membership` 整型向量,其元素必须是 [0, groupCount) 范围内的整数。用于记录事件在每个时间戳上对应的标签。",
|
|
22485
|
+
"",
|
|
22486
|
+
"`prevMembership` 整型向量,其元素可以为空值(对应序列的第一条记录)。用于记录事件在前一个时间戳上对应的标签。",
|
|
22487
|
+
"",
|
|
22488
|
+
"`groupCount` [2, 8] 之间的一个整数。表示函数返回值(元组)的长度,即需要统计的标签数。"
|
|
22489
|
+
]
|
|
22490
|
+
}
|
|
22491
|
+
]
|
|
22492
|
+
},
|
|
22493
|
+
{
|
|
22494
|
+
"title": "详情",
|
|
22495
|
+
"type": "detail",
|
|
22496
|
+
"children": [
|
|
22497
|
+
{
|
|
22498
|
+
"type": "text",
|
|
22499
|
+
"value": [
|
|
22500
|
+
"通常一个事件的类别和属性是固定的。但在某些场景下,事件的类别会动态发生变化。如:在实时处理逐笔数据时,进行大小单的统计以对资金流进行分析。用户期望根据某个订单(事件的属性)的累计交易量来判断该订单是大单还是小单(事件的类别)。随着实时数据不断流入,交易量的不断增加,该订单的类别可能从一个小单变成大单。",
|
|
22501
|
+
"",
|
|
22502
|
+
"dynamicGroupCumcount 即可应用在这类场景下,用于统计在一个时间序列下,不同类别的累计事件数。",
|
|
22503
|
+
"",
|
|
22504
|
+
"具体算法如下:",
|
|
22505
|
+
"",
|
|
22506
|
+
"* 若 *membership* = *prevMembership*,统计量不变。",
|
|
22507
|
+
"* 若 *membership* ≠ *prevMembership*,*membership* 对应组的统计量加1,*prevMembership* 对应的组统计量减1。",
|
|
22508
|
+
"* 若 *prevMembership* 为空值(对应序列的第一条记录),*membership* 对应组的统计量加1,*prevMembership* 无对应组,无需处理。",
|
|
22509
|
+
"",
|
|
22510
|
+
"该函数返回一个长度为 *groupCount* 的元组,其每个元素是一个与 *membership* 等长的向量,依次记录了各标签统计的累积记录数。",
|
|
22511
|
+
"",
|
|
22512
|
+
"注意:元组的下标与标签号一一对应,即标签为 0 的统计结果将输出至元组下标为 0 的向量。"
|
|
22513
|
+
]
|
|
22514
|
+
}
|
|
22515
|
+
]
|
|
22516
|
+
},
|
|
22517
|
+
{
|
|
22518
|
+
"title": "例子",
|
|
22519
|
+
"type": "example",
|
|
22520
|
+
"children": [
|
|
22521
|
+
{
|
|
22522
|
+
"type": "text",
|
|
22523
|
+
"value": [
|
|
22524
|
+
"数据预处理:",
|
|
22525
|
+
""
|
|
22526
|
+
]
|
|
22527
|
+
},
|
|
22528
|
+
{
|
|
22529
|
+
"type": "code",
|
|
22530
|
+
"language": "console",
|
|
22531
|
+
"value": [
|
|
22532
|
+
"",
|
|
22533
|
+
" // 打标签函数",
|
|
22534
|
+
" $ def tag_func(v){",
|
|
22535
|
+
" return iif(v <= 5, 0, iif(v <= 10 and v > 5, 1, 2))",
|
|
22536
|
+
" }",
|
|
22537
|
+
" // 原始数据表",
|
|
22538
|
+
" $ time = take(2022.01.01T09:00:00.000 + 1..3, 6)",
|
|
22539
|
+
" $ sym=`st0`st0`st0`st1`st1`st1",
|
|
22540
|
+
" $ orderNo = `10001`10002`10001`10002`10003`10002",
|
|
22541
|
+
" $ volume = 2 4 6 3 2 9",
|
|
22542
|
+
" $ t = table(sym, time, orderNo, volume)",
|
|
22543
|
+
"",
|
|
22544
|
+
" // 计算累计和并根据阈值打标签",
|
|
22545
|
+
" $ t1 = select *, cumsum(volume) as sumVolume from t context by sym, orderNo",
|
|
22546
|
+
" $ t2 = lj(t, t1,`sym`time`orderNo)",
|
|
22547
|
+
" $ t3 = select sym, time, orderNo, volume, sumVolume, tag_func(sumVolume) as groupId from t2",
|
|
22548
|
+
""
|
|
22549
|
+
]
|
|
22550
|
+
},
|
|
22551
|
+
{
|
|
22552
|
+
"type": "text",
|
|
22553
|
+
"value": [
|
|
22554
|
+
"对于历史数据,可以使用 SQL 语句计算不同组的累计记录数:",
|
|
22555
|
+
""
|
|
22556
|
+
]
|
|
22557
|
+
},
|
|
22558
|
+
{
|
|
22559
|
+
"type": "code",
|
|
22560
|
+
"language": "console",
|
|
22561
|
+
"value": [
|
|
22562
|
+
"",
|
|
22563
|
+
" $ t4 = select sym, time, orderNo, prev(groupId) as prevGroupId from t3 context by sym,orderNo",
|
|
22564
|
+
" $ t5 = lj(t3, t4,`sym`time`orderNo)",
|
|
22565
|
+
" $ re = select sym, time, orderNo, dynamicGroupCumcount(groupId, prevGroupId, 3) as `groupId0`groupId1`groupId2 from t5 context by sym",
|
|
22566
|
+
" $ re",
|
|
22567
|
+
""
|
|
22568
|
+
]
|
|
22569
|
+
},
|
|
22570
|
+
{
|
|
22571
|
+
"type": "text",
|
|
22572
|
+
"value": [
|
|
22573
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22574
|
+
"sym time orderNo groupId0 groupId1 groupId2",
|
|
22575
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22576
|
+
"st0 2022.01.01T09:00:00.001 10001 1 0 0",
|
|
22577
|
+
"st0 2022.01.01T09:00:00.002 10002 2 0 0",
|
|
22578
|
+
"st0 2022.01.01T09:00:00.003 10001 1 1 0",
|
|
22579
|
+
"st1 2022.01.01T09:00:00.001 10002 1 0 0",
|
|
22580
|
+
"st1 2022.01.01T09:00:00.002 10003 2 0 0",
|
|
22581
|
+
"st1 2022.01.01T09:00:00.003 10002 1 0 1",
|
|
22582
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22583
|
+
"",
|
|
22584
|
+
"对于实时数据,可以使用流数据引擎计算不同组的累计记录数:",
|
|
22585
|
+
""
|
|
22586
|
+
]
|
|
22587
|
+
},
|
|
22588
|
+
{
|
|
22589
|
+
"type": "code",
|
|
22590
|
+
"language": "console",
|
|
22591
|
+
"value": [
|
|
22592
|
+
"",
|
|
22593
|
+
" $ result = table(1000:0, `sym`time`orderNo`groupId0`groupId1`groupId2, [SYMBOL, TIME, SYMBOL,INT,INT,INT])",
|
|
22594
|
+
" $ factor0 = [<time>, <prev(groupId) as prevGroupId>, <groupId>, <volume>]",
|
|
22595
|
+
" $ factor1 = [<time>, <orderNo>, <dynamicGroupCumcount(groupId, prevGroupId, 3)>]",
|
|
22596
|
+
" $ dm1 = table(1000:0, `sym`time`orderNo`volume`sumVolume`groupId, [SYMBOL, TIME, SYMBOL,INT, INT,INT])",
|
|
22597
|
+
" $ dm2 = table(1000:0, `sym`orderNo`time`prevGroupId`groupId`volume, [SYMBOL, SYMBOL, TIME, INT,INT,INT])",
|
|
22598
|
+
" $ res1 = createReactiveStateEngine(name=\"reactive_ccnt\", metrics =factor1, dummyTable=dm2, outputTable=result, keyColumn=`sym, keepOrder=true)",
|
|
22599
|
+
" $ res0 = createReactiveStateEngine(name=\"reactive_prev\", metrics =factor0, dummyTable=dm1, outputTable=res1, keyColumn=`sym`orderNo, keepOrder=true)",
|
|
22600
|
+
" $ res0.append!(t3)",
|
|
22601
|
+
"",
|
|
22602
|
+
" $ select * from result",
|
|
22603
|
+
""
|
|
22604
|
+
]
|
|
22605
|
+
},
|
|
22606
|
+
{
|
|
22607
|
+
"type": "text",
|
|
22608
|
+
"value": [
|
|
22609
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22610
|
+
"sym time orderNo groupId0 groupId1 groupId2",
|
|
22611
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22612
|
+
"st0 2022.01.01T09:00:00.001 10001 1 0 0",
|
|
22613
|
+
"st0 2022.01.01T09:00:00.002 10002 2 0 0",
|
|
22614
|
+
"st0 2022.01.01T09:00:00.003 10001 1 1 0",
|
|
22615
|
+
"st1 2022.01.01T09:00:00.001 10002 1 0 0",
|
|
22616
|
+
"st1 2022.01.01T09:00:00.002 10003 2 0 0",
|
|
22617
|
+
"st1 2022.01.01T09:00:00.003 10002 1 0 1",
|
|
22618
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22619
|
+
""
|
|
22620
|
+
]
|
|
22621
|
+
},
|
|
22622
|
+
{
|
|
22623
|
+
"type": "code",
|
|
22624
|
+
"language": "console",
|
|
22625
|
+
"value": [
|
|
22626
|
+
"",
|
|
22627
|
+
" $ dropStreamEngine(\"reactive_ccnt\")",
|
|
22628
|
+
" $ dropStreamEngine(\"reactive_prev\")",
|
|
22629
|
+
""
|
|
22630
|
+
]
|
|
22631
|
+
},
|
|
22632
|
+
{
|
|
22633
|
+
"type": "text",
|
|
22634
|
+
"value": [
|
|
22635
|
+
"相关函数::doc:`/FunctionsandCommands/FunctionReferences/d/dynamicGroupCumsum`"
|
|
22636
|
+
]
|
|
22637
|
+
}
|
|
22638
|
+
]
|
|
22639
|
+
}
|
|
22640
|
+
]
|
|
22641
|
+
},
|
|
22642
|
+
"dynamicGroupCumsum": {
|
|
22643
|
+
"title": "dynamicGroupCumsum",
|
|
22644
|
+
"type": "function",
|
|
22645
|
+
"children": [
|
|
22646
|
+
{
|
|
22647
|
+
"title": "语法",
|
|
22648
|
+
"type": "grammer",
|
|
22649
|
+
"children": [
|
|
22650
|
+
{
|
|
22651
|
+
"type": "text",
|
|
22652
|
+
"value": [
|
|
22653
|
+
"dynamicGroupCumsum(cumValue, prevCumValue, membership, prevMembership, groupCount)"
|
|
22654
|
+
]
|
|
22655
|
+
}
|
|
22656
|
+
]
|
|
22657
|
+
},
|
|
22658
|
+
{
|
|
22659
|
+
"title": "参数",
|
|
22660
|
+
"type": "parameters",
|
|
22661
|
+
"children": [
|
|
22662
|
+
{
|
|
22663
|
+
"type": "text",
|
|
22664
|
+
"value": [
|
|
22665
|
+
"`cumValue` 数值型向量,用于记录事件在每个时间戳上对应的累计值。",
|
|
22666
|
+
"",
|
|
22667
|
+
"`prevCumValue` 数值型向量,其元素可以为空值(对应序列的第一条记录)。用于记录事件在前一个时间戳上对应的累计值。",
|
|
22668
|
+
"",
|
|
22669
|
+
"`membership` 整型向量,其元素必须是 [0, groupCount) 范围内的整数。用于记录事件在每个时间戳上对应的标签。",
|
|
22670
|
+
"",
|
|
22671
|
+
"`prevMembership` 整型向量,其元素可以为空值(对应序列的第一条记录)。用于记录事件在前一个时间戳上对应的标签。",
|
|
22672
|
+
"",
|
|
22673
|
+
"`groupCount` [2, 8] 之间的一个整数。表示函数返回值(元组)的长度,即需要统计的标签数。"
|
|
22674
|
+
]
|
|
22675
|
+
}
|
|
22676
|
+
]
|
|
22677
|
+
},
|
|
22678
|
+
{
|
|
22679
|
+
"title": "详情",
|
|
22680
|
+
"type": "detail",
|
|
22681
|
+
"children": [
|
|
22682
|
+
{
|
|
22683
|
+
"type": "text",
|
|
22684
|
+
"value": [
|
|
22685
|
+
"通常一个事件的类别和属性是固定的。但在某些场景下,事件的类别会动态发生变化。如:在实时处理逐笔数据时,进行大小单的统计以对资金流进行分析。用户期望根据某个订单(事件的属性)的累计交易量来判断该订单是大单还是小单(事件的类别)。随着实时数据不断流入,交易量的不断增加,该订单的类别可能从一个小单变成大单。",
|
|
22686
|
+
"",
|
|
22687
|
+
"dynamicGroupCumsum 即可应用在这类场景下,用于统计在一个时间序列下,某个事件指标在不同类别下的累计值。",
|
|
22688
|
+
"",
|
|
22689
|
+
"具体算法如下:",
|
|
22690
|
+
"",
|
|
22691
|
+
"* 若 *membership* = *prevMembership*,统计量不变。",
|
|
22692
|
+
"* 若 *membership* ≠ *prevMembership*,*membership* 对应组的统计量加 cumValue,*prevMembership* 对应的组统计量减 prevCumValue。",
|
|
22693
|
+
"* 若 *prevMembership* 为空值(对应序列的第一条记录),*membership* 对应组的统计量加 cumValue,*prevMembership* 无对应组,无需处理。",
|
|
22694
|
+
"",
|
|
22695
|
+
"该函数返回一个长度为 *groupCount* 的元组,其每个元素是一个与 *membership* 等长的向量,依次记录了某指标(cumValue 对应的列)在各标签下的累积和。",
|
|
22696
|
+
"",
|
|
22697
|
+
"注意:元组的下标与标签号一一对应,即标签为 0 的统计结果将输出至元组下标为 0 的向量。"
|
|
22698
|
+
]
|
|
22699
|
+
}
|
|
22700
|
+
]
|
|
22701
|
+
},
|
|
22702
|
+
{
|
|
22703
|
+
"title": "例子",
|
|
22704
|
+
"type": "example",
|
|
22705
|
+
"children": [
|
|
22706
|
+
{
|
|
22707
|
+
"type": "text",
|
|
22708
|
+
"value": [
|
|
22709
|
+
"数据预处理:",
|
|
22710
|
+
""
|
|
22711
|
+
]
|
|
22712
|
+
},
|
|
22713
|
+
{
|
|
22714
|
+
"type": "code",
|
|
22715
|
+
"language": "console",
|
|
22716
|
+
"value": [
|
|
22717
|
+
"",
|
|
22718
|
+
" // 打标签函数",
|
|
22719
|
+
" $ def tag_func(v){",
|
|
22720
|
+
" return iif(v <= 5, 0, iif(v <= 10 and v > 5, 1, 2))",
|
|
22721
|
+
" }",
|
|
22722
|
+
" // 原始数据表",
|
|
22723
|
+
" $ time = take(2022.01.01T09:00:00.000 + 1..3, 6)",
|
|
22724
|
+
" $ sym=`st0`st0`st0`st1`st1`st1",
|
|
22725
|
+
" $ orderNo = `10001`10002`10001`10002`10003`10002",
|
|
22726
|
+
" $ volume = 2 4 6 3 2 9",
|
|
22727
|
+
" $ t = table(sym, time, orderNo, volume)",
|
|
22728
|
+
"",
|
|
22729
|
+
" // 计算累计和并根据阈值打标签",
|
|
22730
|
+
" $ t1 = select *, cumsum(volume) as sumVolume from t context by sym, orderNo",
|
|
22731
|
+
" $ t2 = lj(t, t1,`sym`time`orderNo)",
|
|
22732
|
+
" $ t3 = select sym, time, orderNo, volume, sumVolume, tag_func(sumVolume) as groupId from t2",
|
|
22733
|
+
""
|
|
22734
|
+
]
|
|
22735
|
+
},
|
|
22736
|
+
{
|
|
22737
|
+
"type": "text",
|
|
22738
|
+
"value": [
|
|
22739
|
+
"对于历史数据,可以使用 SQL 语句计算不同组的累计成交量:",
|
|
22740
|
+
""
|
|
22741
|
+
]
|
|
22742
|
+
},
|
|
22743
|
+
{
|
|
22744
|
+
"type": "code",
|
|
22745
|
+
"language": "console",
|
|
22746
|
+
"value": [
|
|
22747
|
+
"",
|
|
22748
|
+
" $ t4 = select sym, time, orderNo, prev(groupId) as prevGroupId, groupId, prev(sumVolume) as prevSumVolume, sumVolume from t3 context by sym,orderNo",
|
|
22749
|
+
" $ t5 = lj(t3, t4,`sym`time`orderNo)",
|
|
22750
|
+
" $ re = select sym, time, orderNo, dynamicGroupCumsum(sumVolume, prevSumVolume, groupId, prevGroupId, 3) as `groupId0`groupId1`groupId2 from t5 context by sym",
|
|
22751
|
+
" $ re",
|
|
22752
|
+
""
|
|
22753
|
+
]
|
|
22754
|
+
},
|
|
22755
|
+
{
|
|
22756
|
+
"type": "text",
|
|
22757
|
+
"value": [
|
|
22758
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22759
|
+
"sym time orderNo groupId0 groupId1 groupId2",
|
|
22760
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22761
|
+
"st0 2022.01.01T09:00:00.001 10001 2 0 0",
|
|
22762
|
+
"st0 2022.01.01T09:00:00.002 10002 6 0 0",
|
|
22763
|
+
"st0 2022.01.01T09:00:00.003 10001 4 8 0",
|
|
22764
|
+
"st1 2022.01.01T09:00:00.001 10002 3 0 0",
|
|
22765
|
+
"st1 2022.01.01T09:00:00.002 10003 5 0 0",
|
|
22766
|
+
"st1 2022.01.01T09:00:00.003 10002 2 0 12",
|
|
22767
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22768
|
+
"",
|
|
22769
|
+
"对于实时数据,可以使用流数据引擎计算不同组的累计成交量:",
|
|
22770
|
+
""
|
|
22771
|
+
]
|
|
22772
|
+
},
|
|
22773
|
+
{
|
|
22774
|
+
"type": "code",
|
|
22775
|
+
"language": "console",
|
|
22776
|
+
"value": [
|
|
22777
|
+
"",
|
|
22778
|
+
" $ result = table(1000:0, `sym`time`orderNo`groupId0`groupId1`groupId2, [SYMBOL, TIME, SYMBOL,INT,INT,INT])",
|
|
22779
|
+
" $ factor0 = [ <time>, <prev(groupId) as prevGroupId>, <groupId>, <prev(sumVolume) as prevSumVolume>, <sumVolume>]",
|
|
22780
|
+
" $ factor1 = [<time>, <orderNo>, <dynamicGroupCumsum(sumVolume, prevSumVolume, groupId, prevGroupId, 3)>]",
|
|
22781
|
+
" $ dm1 = table(1000:0, `sym`time`orderNo`volume`sumVolume`groupId, [SYMBOL, TIME, SYMBOL,INT, INT,INT])",
|
|
22782
|
+
" $ dm2 = table(1000:0, `sym`orderNo`time`prevGroupId`groupId`prevSumVolume`sumVolume, [SYMBOL, SYMBOL, TIME, INT, INT, INT, INT])",
|
|
22783
|
+
" $ res1 = createReactiveStateEngine(name=\"reactive_csum\", metrics =factor1, dummyTable=dm2, outputTable=result, keyColumn=`sym, keepOrder=true)",
|
|
22784
|
+
" $ res0 = createReactiveStateEngine(name=\"reactive_prev\", metrics =factor0, dummyTable=dm1, outputTable=res1, keyColumn=`sym`orderNo, keepOrder=true)",
|
|
22785
|
+
" $ res0.append!(t3)",
|
|
22786
|
+
"",
|
|
22787
|
+
" $ select * from result",
|
|
22788
|
+
""
|
|
22789
|
+
]
|
|
22790
|
+
},
|
|
22791
|
+
{
|
|
22792
|
+
"type": "text",
|
|
22793
|
+
"value": [
|
|
22794
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22795
|
+
"sym time orderNo groupId0 groupId1 groupId2",
|
|
22796
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22797
|
+
"st0 2022.01.01T09:00:00.001 10001 2 0 0",
|
|
22798
|
+
"st0 2022.01.01T09:00:00.002 10002 6 0 0",
|
|
22799
|
+
"st0 2022.01.01T09:00:00.003 10001 4 8 0",
|
|
22800
|
+
"st1 2022.01.01T09:00:00.001 10002 3 0 0",
|
|
22801
|
+
"st1 2022.01.01T09:00:00.002 10003 5 0 0",
|
|
22802
|
+
"st1 2022.01.01T09:00:00.003 10002 2 0 12",
|
|
22803
|
+
"==== ======================= ======== ======== ======== ========",
|
|
22804
|
+
""
|
|
22805
|
+
]
|
|
22806
|
+
},
|
|
22807
|
+
{
|
|
22808
|
+
"type": "code",
|
|
22809
|
+
"language": "console",
|
|
22810
|
+
"value": [
|
|
22811
|
+
"",
|
|
22812
|
+
" $ dropStreamEngine(\"reactive_csum\")",
|
|
22813
|
+
" $ dropStreamEngine(\"reactive_prev\")",
|
|
22814
|
+
""
|
|
22815
|
+
]
|
|
22816
|
+
},
|
|
22817
|
+
{
|
|
22818
|
+
"type": "text",
|
|
22819
|
+
"value": [
|
|
22820
|
+
"相关函数::doc:`/FunctionsandCommands/FunctionReferences/d/dynamicGroupCumcount`"
|
|
22821
|
+
]
|
|
22822
|
+
}
|
|
22823
|
+
]
|
|
22824
|
+
}
|
|
22825
|
+
]
|
|
22826
|
+
},
|
|
22023
22827
|
"eig": {
|
|
22024
22828
|
"title": "eig",
|
|
22025
22829
|
"type": "function",
|
|
@@ -22868,13 +23672,13 @@
|
|
|
22868
23672
|
"value": [
|
|
22869
23673
|
" ",
|
|
22870
23674
|
" $ eqFloat(0.1234567891, 0.123456789);",
|
|
22871
|
-
"
|
|
23675
|
+
" true",
|
|
22872
23676
|
"",
|
|
22873
23677
|
" $ eqFloat(0.123456788, 0.123456789);",
|
|
22874
|
-
"
|
|
23678
|
+
" false",
|
|
22875
23679
|
"",
|
|
22876
23680
|
" $ eqFloat(0.123456788 0.123456789 0.1234567891, 0.123456789);",
|
|
22877
|
-
" [
|
|
23681
|
+
" [false,true,true]",
|
|
22878
23682
|
""
|
|
22879
23683
|
]
|
|
22880
23684
|
},
|
|
@@ -22926,7 +23730,9 @@
|
|
|
22926
23730
|
{
|
|
22927
23731
|
"type": "text",
|
|
22928
23732
|
"value": [
|
|
22929
|
-
"
|
|
23733
|
+
"检验两个对象的类型和值是否相同。只有当类型和值都相同时,此函数才会返回true。 如果值相同但类型不同,则此函数仍返回false,这与函数 :doc:`eq` 不同。",
|
|
23734
|
+
"",
|
|
23735
|
+
"注意:使用 eqObj 比较浮点数时,根据 abs(obj1-obj2)<=pow(10,-precision) 的结果来判断 obj1 和 obj2 的值是否相等。"
|
|
22930
23736
|
]
|
|
22931
23737
|
}
|
|
22932
23738
|
]
|
|
@@ -22941,21 +23747,21 @@
|
|
|
22941
23747
|
"value": [
|
|
22942
23748
|
" ",
|
|
22943
23749
|
" $ eqObj(2, 2.0);",
|
|
22944
|
-
"
|
|
23750
|
+
" false",
|
|
22945
23751
|
"",
|
|
22946
23752
|
" $ eq(2, 2.0);",
|
|
22947
|
-
"
|
|
23753
|
+
" true",
|
|
22948
23754
|
"",
|
|
22949
23755
|
" $ eqObj(1.1, 1.2, 0);",
|
|
22950
|
-
"
|
|
23756
|
+
" true",
|
|
22951
23757
|
"",
|
|
22952
23758
|
" $ eqObj(1.1, 1.2, 1);",
|
|
22953
|
-
"
|
|
23759
|
+
" false",
|
|
22954
23760
|
"",
|
|
22955
23761
|
" $ eqObj(1 2 3, 1 2 3);",
|
|
22956
|
-
"
|
|
23762
|
+
" true",
|
|
22957
23763
|
" $ eq(1 2 3, 1 2 3);",
|
|
22958
|
-
" [
|
|
23764
|
+
" [true,true,true]",
|
|
22959
23765
|
""
|
|
22960
23766
|
]
|
|
22961
23767
|
},
|
|
@@ -22978,7 +23784,7 @@
|
|
|
22978
23784
|
" ([1,2,3],[4,5,6])",
|
|
22979
23785
|
"",
|
|
22980
23786
|
" $ each(eqObj, t1.values(), t2.values());",
|
|
22981
|
-
" [
|
|
23787
|
+
" [true,true]"
|
|
22982
23788
|
]
|
|
22983
23789
|
}
|
|
22984
23790
|
]
|
|
@@ -28143,15 +28949,24 @@
|
|
|
28143
28949
|
"",
|
|
28144
28950
|
"* version: 版本号",
|
|
28145
28951
|
"",
|
|
28146
|
-
"*
|
|
28147
|
-
"",
|
|
28148
|
-
"*
|
|
28952
|
+
"* vcLength: 版本链长度",
|
|
28953
|
+
" ",
|
|
28954
|
+
"* versionChain: 版本链",
|
|
28149
28955
|
"",
|
|
28150
28956
|
"* state: chunk 状态。CONSTRUCTING:正在事务中; RECOVERING:正在 recovery 中;COMPLETE:已经处于事务终止状态;",
|
|
28151
28957
|
"",
|
|
28152
28958
|
"* replicas: 副本的分布信息",
|
|
28153
28959
|
"",
|
|
28154
|
-
"* replicaCount: 副本数"
|
|
28960
|
+
"* replicaCount: 副本数",
|
|
28961
|
+
"",
|
|
28962
|
+
"* permission: CHUNK 的权限。CHUNK 的权限分为 READ_ONLY 以及 READ_WRITE(默认权限)两类。正在进行迁移的分区,或存储在 s3 的分区权限均为 READ_ONLY。",
|
|
28963
|
+
"",
|
|
28964
|
+
"对于 READ_ONLY 权限的分区:",
|
|
28965
|
+
"",
|
|
28966
|
+
"\\(1) 不能追加或更新数据,并只能通过调用 drop 类函数进行删除,且遵从事务的原则。(注意:存储在 s3 的分区不支持事务)。",
|
|
28967
|
+
"",
|
|
28968
|
+
"\\(2) 不能对其进行 recovery 和 rebalance。",
|
|
28969
|
+
""
|
|
28155
28970
|
]
|
|
28156
28971
|
}
|
|
28157
28972
|
]
|
|
@@ -28172,16 +28987,16 @@
|
|
|
28172
28987
|
{
|
|
28173
28988
|
"type": "text",
|
|
28174
28989
|
"value": [
|
|
28175
|
-
"=================== =============== ==== ======= ======== =================== ======== ====================
|
|
28176
|
-
"chunkId file size version vcLength versionChain state replicas replicaCount",
|
|
28177
|
-
"=================== =============== ==== ======= ======== =================== ======== ====================
|
|
28178
|
-
"092d5e12-e595-6f... /testDB/pt2.tbl 49 1 1 2052:49:1 -> COMPLETE P1-node1:1:0,P2-... 2",
|
|
28179
|
-
"42936e31-8be0-fa... /testDB/9/i 0 2 2 2053:0:2 -> 2051... COMPLETE P3-node1:2:0,P1-... 2",
|
|
28180
|
-
"d31e6b47-18f0-37... /testDB/7/i 0 2 2 2053:0:2 -> 2051... COMPLETE P1-node1:2:0,P2-... 2",
|
|
28181
|
-
"647a5fd6-cd85-3b... /testDB/6/i 0 2 2 2053:0:2 -> 2051... COMPLETE P1-node1:2:0,P3-... 2",
|
|
28182
|
-
"8bec6445-bc6d-36... /testDB/5/i 0 2 2 2053:0:2 -> 2051... COMPLETE P2-node1:2:0,P3-... 2",
|
|
28183
|
-
"ca690ba5-be73-a6... /testDB/4/i 0 2 2 2053:0:2 -> 2051... COMPLETE P3-node1:2:0,P1-... 2",
|
|
28184
|
-
"=================== =============== ==== ======= ======== =================== ======== ====================
|
|
28990
|
+
"=================== =============== ==== ======= ======== =================== ======== ==================== ============== ===========",
|
|
28991
|
+
"chunkId file size version vcLength versionChain state replicas replicaCount permission",
|
|
28992
|
+
"=================== =============== ==== ======= ======== =================== ======== ==================== ============== ===========",
|
|
28993
|
+
"092d5e12-e595-6f... /testDB/pt2.tbl 49 1 1 2052:49:1 -> COMPLETE P1-node1:1:0,P2-... 2 READ_WRITE",
|
|
28994
|
+
"42936e31-8be0-fa... /testDB/9/i 0 2 2 2053:0:2 -> 2051... COMPLETE P3-node1:2:0,P1-... 2 READ_WRITE",
|
|
28995
|
+
"d31e6b47-18f0-37... /testDB/7/i 0 2 2 2053:0:2 -> 2051... COMPLETE P1-node1:2:0,P2-... 2 READ_WRITE",
|
|
28996
|
+
"647a5fd6-cd85-3b... /testDB/6/i 0 2 2 2053:0:2 -> 2051... COMPLETE P1-node1:2:0,P3-... 2 READ_WRITE",
|
|
28997
|
+
"8bec6445-bc6d-36... /testDB/5/i 0 2 2 2053:0:2 -> 2051... COMPLETE P2-node1:2:0,P3-... 2 READ_WRITE",
|
|
28998
|
+
"ca690ba5-be73-a6... /testDB/4/i 0 2 2 2053:0:2 -> 2051... COMPLETE P3-node1:2:0,P1-... 2 READ_WRITE",
|
|
28999
|
+
"=================== =============== ==== ======= ======== =================== ======== ==================== ============== ==========="
|
|
28185
29000
|
]
|
|
28186
29001
|
}
|
|
28187
29002
|
]
|
|
@@ -28942,7 +29757,7 @@
|
|
|
28942
29757
|
{
|
|
28943
29758
|
"type": "text",
|
|
28944
29759
|
"value": [
|
|
28945
|
-
"获取当前 session 的
|
|
29760
|
+
"获取当前 session 的 session ID 和用户名。返回一个 tuple,第一个元素为 sessionId,第二个元素为 userId。"
|
|
28946
29761
|
]
|
|
28947
29762
|
}
|
|
28948
29763
|
]
|
|
@@ -31789,7 +32604,7 @@
|
|
|
31789
32604
|
{
|
|
31790
32605
|
"type": "text",
|
|
31791
32606
|
"value": [
|
|
31792
|
-
"获取当前节点所在的流数据Raft组的信息。返回的结果是一个表,第一列表示Raft组的id,第二列表示Raft
|
|
32607
|
+
"获取当前节点所在的流数据Raft组的信息。返回的结果是一个表,第一列表示Raft组的id,第二列表示Raft组包含的数据节点/计算节点信息。"
|
|
31793
32608
|
]
|
|
31794
32609
|
}
|
|
31795
32610
|
]
|
|
@@ -31952,7 +32767,7 @@
|
|
|
31952
32767
|
"lastErrMsg 最后一条错误消息的信息 ",
|
|
31953
32768
|
"msgAsTable 布尔值,表示订阅的数据是否为表。true表示订阅的数据为表;false表示订阅的数据是由列组成的元组。 ",
|
|
31954
32769
|
"batchSize handler批量处理的消息数 ",
|
|
31955
|
-
"throttle
|
|
32770
|
+
"throttle 数值类型,单位为毫秒。表示继上次handler处理消息之后,若batchSize条件一直未达到,多久后再次处理消息 ",
|
|
31956
32771
|
"hash 非负整数,指定某个订阅线程处理进来的消息 ",
|
|
31957
32772
|
"filter 流数据表指定的过滤列 ",
|
|
31958
32773
|
"persistOffset 布尔值,表示是否持久化保存最新一条已经处理的订阅数据的偏移量 ",
|
|
@@ -42748,6 +43563,77 @@
|
|
|
42748
43563
|
}
|
|
42749
43564
|
]
|
|
42750
43565
|
},
|
|
43566
|
+
"loadDistributedInMemoryTable": {
|
|
43567
|
+
"title": "loadDistributedInMemoryTable",
|
|
43568
|
+
"type": "function",
|
|
43569
|
+
"children": [
|
|
43570
|
+
{
|
|
43571
|
+
"title": "语法",
|
|
43572
|
+
"type": "grammer",
|
|
43573
|
+
"children": [
|
|
43574
|
+
{
|
|
43575
|
+
"type": "text",
|
|
43576
|
+
"value": [
|
|
43577
|
+
"loadDistributedInMemoryTable(tableName)"
|
|
43578
|
+
]
|
|
43579
|
+
}
|
|
43580
|
+
]
|
|
43581
|
+
},
|
|
43582
|
+
{
|
|
43583
|
+
"title": "参数",
|
|
43584
|
+
"type": "parameters",
|
|
43585
|
+
"children": [
|
|
43586
|
+
{
|
|
43587
|
+
"type": "text",
|
|
43588
|
+
"value": [
|
|
43589
|
+
"`tableName` 字符串标量,表示分布式共享内存表的名称。"
|
|
43590
|
+
]
|
|
43591
|
+
}
|
|
43592
|
+
]
|
|
43593
|
+
},
|
|
43594
|
+
{
|
|
43595
|
+
"title": "详情",
|
|
43596
|
+
"type": "detail",
|
|
43597
|
+
"children": [
|
|
43598
|
+
{
|
|
43599
|
+
"type": "text",
|
|
43600
|
+
"value": [
|
|
43601
|
+
"返回分布式共享内存表的句柄。该函数只能在数据节点/计算节点上执行。"
|
|
43602
|
+
]
|
|
43603
|
+
}
|
|
43604
|
+
]
|
|
43605
|
+
},
|
|
43606
|
+
{
|
|
43607
|
+
"title": "例子",
|
|
43608
|
+
"type": "example",
|
|
43609
|
+
"children": [
|
|
43610
|
+
{
|
|
43611
|
+
"type": "code",
|
|
43612
|
+
"language": "console",
|
|
43613
|
+
"value": [
|
|
43614
|
+
"",
|
|
43615
|
+
" $ pt = createDistributedInMemoryTable(`dt, `time`id`value, `DATETIME`INT`LONG, HASH, [INT, 2],`id)",
|
|
43616
|
+
" $ time = take(2021.08.20 00:00:00..2021.08.30 00:00:00, 40);",
|
|
43617
|
+
" $ id = 0..39;",
|
|
43618
|
+
" $ value = rand(100, 40);",
|
|
43619
|
+
" $ tmp = table(time, id, value);",
|
|
43620
|
+
"",
|
|
43621
|
+
" $ pt = loadDistributedInMemoryTable(`dt)",
|
|
43622
|
+
" $ pt.append!(tmp);",
|
|
43623
|
+
" $ select * from pt;",
|
|
43624
|
+
""
|
|
43625
|
+
]
|
|
43626
|
+
},
|
|
43627
|
+
{
|
|
43628
|
+
"type": "text",
|
|
43629
|
+
"value": [
|
|
43630
|
+
"相关函数::doc:`/FunctionsandCommands/CommandsReferences/d/dropDistributedInMemoryTable`, :doc:`/FunctionsandCommands/FunctionReferences/c/createDistributedInMemoryTable`"
|
|
43631
|
+
]
|
|
43632
|
+
}
|
|
43633
|
+
]
|
|
43634
|
+
}
|
|
43635
|
+
]
|
|
43636
|
+
},
|
|
42751
43637
|
"loadModel": {
|
|
42752
43638
|
"title": "loadModel",
|
|
42753
43639
|
"type": "function",
|
|
@@ -44021,7 +44907,7 @@
|
|
|
44021
44907
|
"value": [
|
|
44022
44908
|
"",
|
|
44023
44909
|
" $ schematable=table(`sym`permno`date`open`high`close`pre_close`change`vol`amount as name,`SYMBOL`SYMBOL`DATE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`INT`DOUBLE as type)",
|
|
44024
|
-
" $ tt=loadText(\"C:/DolphinDB/Data/stock.csv\",,
|
|
44910
|
+
" $ tt=loadText(\"C:/DolphinDB/Data/stock.csv\",,schematable)",
|
|
44025
44911
|
" $ schema(tt).colDefs;",
|
|
44026
44912
|
""
|
|
44027
44913
|
]
|
|
@@ -44755,7 +45641,7 @@
|
|
|
44755
45641
|
{
|
|
44756
45642
|
"type": "text",
|
|
44757
45643
|
"value": [
|
|
44758
|
-
"
|
|
45644
|
+
"用户可在控制器节点或数据节点/计算节点上登录。"
|
|
44759
45645
|
]
|
|
44760
45646
|
}
|
|
44761
45647
|
]
|
|
@@ -44974,7 +45860,7 @@
|
|
|
44974
45860
|
"",
|
|
44975
45861
|
"如果 *sessionOnly* 为true,用户只退出登录当前会话。",
|
|
44976
45862
|
"",
|
|
44977
|
-
"如果 *sessionOnly* 为false
|
|
45863
|
+
"如果 *sessionOnly* 为false,用户会退出登录当前会话、所有的数据节点/计算节点以及控制节点。",
|
|
44978
45864
|
"",
|
|
44979
45865
|
"管理员可以使其他用户退出登录。如果管理员使用户退出登录,用户会退出登录当前会话、所有的数据节点/计算节点以及控制节点。"
|
|
44980
45866
|
]
|
|
@@ -48750,6 +49636,82 @@
|
|
|
48750
49636
|
}
|
|
48751
49637
|
]
|
|
48752
49638
|
},
|
|
49639
|
+
"memSize": {
|
|
49640
|
+
"title": "memSize",
|
|
49641
|
+
"type": "function",
|
|
49642
|
+
"children": [
|
|
49643
|
+
{
|
|
49644
|
+
"title": "语法",
|
|
49645
|
+
"type": "grammer",
|
|
49646
|
+
"children": [
|
|
49647
|
+
{
|
|
49648
|
+
"type": "text",
|
|
49649
|
+
"value": [
|
|
49650
|
+
"memSize(obj)"
|
|
49651
|
+
]
|
|
49652
|
+
}
|
|
49653
|
+
]
|
|
49654
|
+
},
|
|
49655
|
+
{
|
|
49656
|
+
"title": "参数",
|
|
49657
|
+
"type": "parameters",
|
|
49658
|
+
"children": [
|
|
49659
|
+
{
|
|
49660
|
+
"type": "text",
|
|
49661
|
+
"value": [
|
|
49662
|
+
"`obj` 一个对象。"
|
|
49663
|
+
]
|
|
49664
|
+
}
|
|
49665
|
+
]
|
|
49666
|
+
},
|
|
49667
|
+
{
|
|
49668
|
+
"title": "详情",
|
|
49669
|
+
"type": "detail",
|
|
49670
|
+
"children": [
|
|
49671
|
+
{
|
|
49672
|
+
"type": "text",
|
|
49673
|
+
"value": [
|
|
49674
|
+
"返回本地对象或共享对象占用内存大小,单位为字节。"
|
|
49675
|
+
]
|
|
49676
|
+
}
|
|
49677
|
+
]
|
|
49678
|
+
},
|
|
49679
|
+
{
|
|
49680
|
+
"title": "例子",
|
|
49681
|
+
"type": "example",
|
|
49682
|
+
"children": [
|
|
49683
|
+
{
|
|
49684
|
+
"type": "code",
|
|
49685
|
+
"language": "console",
|
|
49686
|
+
"value": [
|
|
49687
|
+
"",
|
|
49688
|
+
" $ $ n=100",
|
|
49689
|
+
" $ ID=rand(100, n)",
|
|
49690
|
+
" $ date=rand(2017.08.07..2017.08.11, n)",
|
|
49691
|
+
" $ x=rand(10.0, n)",
|
|
49692
|
+
" $ t=table(ID, date, x);",
|
|
49693
|
+
" $ share t as tt",
|
|
49694
|
+
" $ memSize(t)",
|
|
49695
|
+
" 1952",
|
|
49696
|
+
" $ memSize(tt)",
|
|
49697
|
+
" 1952",
|
|
49698
|
+
" $ memSize(t[`x])",
|
|
49699
|
+
" 800",
|
|
49700
|
+
" $ memSize(select avg(x) as avgx from t)",
|
|
49701
|
+
" 280",
|
|
49702
|
+
""
|
|
49703
|
+
]
|
|
49704
|
+
},
|
|
49705
|
+
{
|
|
49706
|
+
"type": "text",
|
|
49707
|
+
"value": [
|
|
49708
|
+
"相关函数::doc:`../o/objs`"
|
|
49709
|
+
]
|
|
49710
|
+
}
|
|
49711
|
+
]
|
|
49712
|
+
}
|
|
49713
|
+
]
|
|
49714
|
+
},
|
|
48753
49715
|
"member": {
|
|
48754
49716
|
"title": "member",
|
|
48755
49717
|
"type": "function",
|
|
@@ -51596,6 +52558,51 @@
|
|
|
51596
52558
|
}
|
|
51597
52559
|
]
|
|
51598
52560
|
},
|
|
52561
|
+
"moveHotDataToColdVolume": {
|
|
52562
|
+
"title": "moveHotDataToColdVolume",
|
|
52563
|
+
"type": "command",
|
|
52564
|
+
"children": [
|
|
52565
|
+
{
|
|
52566
|
+
"title": "语法",
|
|
52567
|
+
"type": "grammer",
|
|
52568
|
+
"children": [
|
|
52569
|
+
{
|
|
52570
|
+
"type": "text",
|
|
52571
|
+
"value": [
|
|
52572
|
+
"moveHotDataToColdVolume([checkRange=240])"
|
|
52573
|
+
]
|
|
52574
|
+
}
|
|
52575
|
+
]
|
|
52576
|
+
},
|
|
52577
|
+
{
|
|
52578
|
+
"title": "参数",
|
|
52579
|
+
"type": "parameters",
|
|
52580
|
+
"children": [
|
|
52581
|
+
{
|
|
52582
|
+
"type": "text",
|
|
52583
|
+
"value": [
|
|
52584
|
+
"`checkRange` 整数,单位为小时,默认值为 10 天,即 240 小时。用于设置需迁移至 *coldVolumes* 的数据的时间范围。设置后,时间范围在 [当前时间 - hoursToColdVolumes - checkRange, 当前时间 - hoursToColdVolumes) 内的数据将会被迁移至 coldVolumes。"
|
|
52585
|
+
]
|
|
52586
|
+
}
|
|
52587
|
+
]
|
|
52588
|
+
},
|
|
52589
|
+
{
|
|
52590
|
+
"title": "详情",
|
|
52591
|
+
"type": "detail",
|
|
52592
|
+
"children": [
|
|
52593
|
+
{
|
|
52594
|
+
"type": "text",
|
|
52595
|
+
"value": [
|
|
52596
|
+
"用于强制触发将用户指定范围的数据转存至 coldVolumes。",
|
|
52597
|
+
"",
|
|
52598
|
+
"该命令设置的转存策略与 :doc:`/FunctionsandCommands/CommandsReferences/s/setRetentionPolicy` 设置的转存策略的有一定区别,详情请参考 :doc:`/DatabaseandDistributedComputing/Database/TieredStorage`。",
|
|
52599
|
+
""
|
|
52600
|
+
]
|
|
52601
|
+
}
|
|
52602
|
+
]
|
|
52603
|
+
}
|
|
52604
|
+
]
|
|
52605
|
+
},
|
|
51599
52606
|
"moveReplicas": {
|
|
51600
52607
|
"title": "moveReplicas",
|
|
51601
52608
|
"type": "command",
|
|
@@ -58506,7 +59513,7 @@
|
|
|
58506
59513
|
{
|
|
58507
59514
|
"type": "text",
|
|
58508
59515
|
"value": [
|
|
58509
|
-
"`function`
|
|
59516
|
+
"`function` 调用的本地函数(不能使用引号)。它可以是一个没有定义参数的函数,或者是没有参数的封装了初始函数和参数的部分应用。它可以是内置函数或用户自定义函数。",
|
|
58510
59517
|
"",
|
|
58511
59518
|
"`nodes` 节点的别名。如果没有指定,系统会调用集群中所有活数据节点/计算节点。",
|
|
58512
59519
|
"",
|
|
@@ -58534,7 +59541,35 @@
|
|
|
58534
59541
|
{
|
|
58535
59542
|
"type": "text",
|
|
58536
59543
|
"value": [
|
|
58537
|
-
"
|
|
59544
|
+
"例1. 函数 `getChunksMeta` 不指定参数。",
|
|
59545
|
+
""
|
|
59546
|
+
]
|
|
59547
|
+
},
|
|
59548
|
+
{
|
|
59549
|
+
"type": "code",
|
|
59550
|
+
"language": "console",
|
|
59551
|
+
"value": [
|
|
59552
|
+
"",
|
|
59553
|
+
" $ pnodeRun(getChunksMeta,,false);",
|
|
59554
|
+
""
|
|
59555
|
+
]
|
|
59556
|
+
},
|
|
59557
|
+
{
|
|
59558
|
+
"type": "text",
|
|
59559
|
+
"value": [
|
|
59560
|
+
"========= ===================================== ============================================================================= ======================= ===== ===== ===== ======== ====== ==========================",
|
|
59561
|
+
"site chunkId path dfsPath type flag size version state versionList ",
|
|
59562
|
+
"========= ===================================== ============================================================================= ======================= ===== ===== ===== ======== ====== ==========================",
|
|
59563
|
+
"local8848 bd13090e-7177-01a7-4ac4-840e1b977dcf D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190605/GOOG /compo/20190605/GOOG 1 0 0 1 0 cid : 40,pt2=>40:6729; # ",
|
|
59564
|
+
"local8848 b4935730-6372-b2a1-4f24-6c323037e576 e:\\data/CHUNKS/compo/20190605/AAPL /compo/20190605/AAPL 1 0 0 1 0 cid : 40,pt2=>40:6613; # ",
|
|
59565
|
+
"local8848 f8ee72c9-dad3-f49e-430e-5ddb3c61ae18 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190604/MSFT /compo/20190604/MSFT 1 0 0 1 0 cid : 40,pt2=>40:6664; # ",
|
|
59566
|
+
"local8848 08e26b5a-dfac-799f-4979-0dd3902eae6e D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190604/GOOG /compo/20190604/GOOG 1 0 0 1 0 cid : 40,pt2=>40:6635; # ",
|
|
59567
|
+
"local8848 f9e53a3d-af3e-018d-4bfa-a2b4980f3561 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190604/AAPL /compo/20190604/AAPL 1 0 0 1 0 cid : 40,pt2=>40:6783; # ",
|
|
59568
|
+
"local8848 417e49e9-5c61-cf9e-4b21-4b35f8e57273 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190601/MSFT /compo/20190601/MSFT 1 0 0 1 0 cid : 40,pt2=>40:6602; # ",
|
|
59569
|
+
"local8848 3ee64942-1d72-bea7-4bc1-f720132d9288 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190602/AAPL /compo/20190602/AAPL 1 0 0 1 0 cid : 40,pt2=>40:6749; # ",
|
|
59570
|
+
"========= ===================================== ============================================================================= ======================= ===== ===== ===== ======== ====== ==========================",
|
|
59571
|
+
"",
|
|
59572
|
+
"例2. 在下例中,函数 `sum` 和参数1..10被封装成了部分应用 `sum{1..10}`。",
|
|
58538
59573
|
""
|
|
58539
59574
|
]
|
|
58540
59575
|
},
|
|
@@ -58557,7 +59592,7 @@
|
|
|
58557
59592
|
"DFS_NODE3 55",
|
|
58558
59593
|
"=========== ======",
|
|
58559
59594
|
"",
|
|
58560
|
-
"
|
|
59595
|
+
"例3. `pnodeRun` 对于集群管理非常方便。例如,在一个集群中有4个节点:\"DFS_NODE1\", \"DFS_NODE2\", \"DFS_NODE3\" 和 \"DFS_NODE4\"。在每个节点上执行以下脚本:",
|
|
58561
59596
|
""
|
|
58562
59597
|
]
|
|
58563
59598
|
},
|
|
@@ -58645,34 +59680,8 @@
|
|
|
58645
59680
|
"+---------+-------+--------+--------+-----------------------+-----------------------+-----------------------+--------+",
|
|
58646
59681
|
"|DFS_NODE4| root |jobDemo3|job demo|2017.11.16T13:05:16.325|2017.11.16T13:05:16.328|2017.11.16T13:05:34.716| |",
|
|
58647
59682
|
"+---------+-------+--------+--------+-----------------------+-----------------------+-----------------------+--------+",
|
|
58648
|
-
""
|
|
58649
|
-
]
|
|
58650
|
-
},
|
|
58651
|
-
{
|
|
58652
|
-
"type": "code",
|
|
58653
|
-
"language": "console",
|
|
58654
|
-
"value": [
|
|
58655
59683
|
"",
|
|
58656
|
-
"
|
|
58657
|
-
""
|
|
58658
|
-
]
|
|
58659
|
-
},
|
|
58660
|
-
{
|
|
58661
|
-
"type": "text",
|
|
58662
|
-
"value": [
|
|
58663
|
-
"========= ===================================== ============================================================================= ======================= ===== ===== ===== ======== ====== ==========================",
|
|
58664
|
-
"site chunkId path dfsPath type flag size version state versionList ",
|
|
58665
|
-
"========= ===================================== ============================================================================= ======================= ===== ===== ===== ======== ====== ==========================",
|
|
58666
|
-
"local8848 bd13090e-7177-01a7-4ac4-840e1b977dcf D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190605/GOOG /compo/20190605/GOOG 1 0 0 1 0 cid : 40,pt2=>40:6729; # ",
|
|
58667
|
-
"local8848 b4935730-6372-b2a1-4f24-6c323037e576 e:\\data/CHUNKS/compo/20190605/AAPL /compo/20190605/AAPL 1 0 0 1 0 cid : 40,pt2=>40:6613; # ",
|
|
58668
|
-
"local8848 f8ee72c9-dad3-f49e-430e-5ddb3c61ae18 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190604/MSFT /compo/20190604/MSFT 1 0 0 1 0 cid : 40,pt2=>40:6664; # ",
|
|
58669
|
-
"local8848 08e26b5a-dfac-799f-4979-0dd3902eae6e D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190604/GOOG /compo/20190604/GOOG 1 0 0 1 0 cid : 40,pt2=>40:6635; # ",
|
|
58670
|
-
"local8848 f9e53a3d-af3e-018d-4bfa-a2b4980f3561 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190604/AAPL /compo/20190604/AAPL 1 0 0 1 0 cid : 40,pt2=>40:6783; # ",
|
|
58671
|
-
"local8848 417e49e9-5c61-cf9e-4b21-4b35f8e57273 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190601/MSFT /compo/20190601/MSFT 1 0 0 1 0 cid : 40,pt2=>40:6602; # ",
|
|
58672
|
-
"local8848 3ee64942-1d72-bea7-4bc1-f720132d9288 D:\\130\\DolphinDB_Win64_V\\server\\local8848\\storage/CHUNKS/compo/20190602/AAPL /compo/20190602/AAPL 1 0 0 1 0 cid : 40,pt2=>40:6749; # ",
|
|
58673
|
-
"========= ===================================== ============================================================================= ======================= ===== ===== ===== ======== ====== ==========================",
|
|
58674
|
-
"",
|
|
58675
|
-
"*pnodeRun* 合并多个节点的结果时遵循以下规则:",
|
|
59684
|
+
"`pnodeRun` 合并多个节点的结果时遵循以下规则:",
|
|
58676
59685
|
"",
|
|
58677
59686
|
"\\(1) 如果 *function* 返回一个标量:",
|
|
58678
59687
|
"",
|
|
@@ -60479,7 +61488,7 @@
|
|
|
60479
61488
|
"value": [
|
|
60480
61489
|
"`X` 标量或向量;",
|
|
60481
61490
|
"",
|
|
60482
|
-
"`count`
|
|
61491
|
+
"`count` INT 型标量或数据对。若为标量,表示输出向量的长度;若为数据对,表示输出矩阵的维度。"
|
|
60483
61492
|
]
|
|
60484
61493
|
}
|
|
60485
61494
|
]
|
|
@@ -60766,6 +61775,83 @@
|
|
|
60766
61775
|
}
|
|
60767
61776
|
]
|
|
60768
61777
|
},
|
|
61778
|
+
"randDiscrete": {
|
|
61779
|
+
"title": "randDiscrete",
|
|
61780
|
+
"type": "function",
|
|
61781
|
+
"children": [
|
|
61782
|
+
{
|
|
61783
|
+
"title": "语法",
|
|
61784
|
+
"type": "grammer",
|
|
61785
|
+
"children": [
|
|
61786
|
+
{
|
|
61787
|
+
"type": "text",
|
|
61788
|
+
"value": [
|
|
61789
|
+
"randDiscrete(v, p, count)"
|
|
61790
|
+
]
|
|
61791
|
+
}
|
|
61792
|
+
]
|
|
61793
|
+
},
|
|
61794
|
+
{
|
|
61795
|
+
"title": "参数",
|
|
61796
|
+
"type": "parameters",
|
|
61797
|
+
"children": [
|
|
61798
|
+
{
|
|
61799
|
+
"type": "text",
|
|
61800
|
+
"value": [
|
|
61801
|
+
"`v` 向量或元组,表示样本数据。",
|
|
61802
|
+
"",
|
|
61803
|
+
"`p` 与 v 等长的浮点型向量,其每个元素必须是正数,对应 v 中采样元素的概率分布。系统会自动将 p 的元素归一化。",
|
|
61804
|
+
"",
|
|
61805
|
+
"`count` 正整数,表示输出的随机向量的长度。"
|
|
61806
|
+
]
|
|
61807
|
+
}
|
|
61808
|
+
]
|
|
61809
|
+
},
|
|
61810
|
+
{
|
|
61811
|
+
"title": "详情",
|
|
61812
|
+
"type": "detail",
|
|
61813
|
+
"children": [
|
|
61814
|
+
{
|
|
61815
|
+
"type": "text",
|
|
61816
|
+
"value": [
|
|
61817
|
+
"根据给定的分布概率 p,生成向量 v 的随机样本。生成样本的长度由 count 指定。"
|
|
61818
|
+
]
|
|
61819
|
+
}
|
|
61820
|
+
]
|
|
61821
|
+
},
|
|
61822
|
+
{
|
|
61823
|
+
"title": "例子",
|
|
61824
|
+
"type": "example",
|
|
61825
|
+
"children": [
|
|
61826
|
+
{
|
|
61827
|
+
"type": "code",
|
|
61828
|
+
"language": "console",
|
|
61829
|
+
"value": [
|
|
61830
|
+
"",
|
|
61831
|
+
" $ randDiscrete(1..5, [0.1, 0.1, 0.2, 0.2, 0.4], 10)",
|
|
61832
|
+
" [2,3,5,2,5,5,2,1,1,2]",
|
|
61833
|
+
"",
|
|
61834
|
+
" //若概率和不为1,系统会自动归一化 ",
|
|
61835
|
+
" $ randDiscrete(1..5, [0.1, 0.2, 0.3, 0.4, 0.5], 5)",
|
|
61836
|
+
" [5,1,2,3,5]",
|
|
61837
|
+
"",
|
|
61838
|
+
" $ randDiscrete(`A`B`C`E`F, [0.1, 0.2, 0.3, 0.4, 0.5], 5)",
|
|
61839
|
+
" [\"C\",\"E\",\"B\",\"C\",\"F\"]",
|
|
61840
|
+
"",
|
|
61841
|
+
" // 输入元组,对元组中的每个元素进行采样",
|
|
61842
|
+
" $ randDiscrete([[1,2], [2,3,4], 'S', 'abc'], [0.3, 0.3, 0.2, 0.1], 10)",
|
|
61843
|
+
" ('S',[2,3,4],[1,2],[2,3,4],[1,2],'S','S',[2,3,4],[2,3,4],[2,3,4])",
|
|
61844
|
+
"",
|
|
61845
|
+
" // 输入数组向量,对其中的每个向量进行采样",
|
|
61846
|
+
" $ a = array(INT[], 0, 10).append!([1 2 3, 4 5,6 7 8, 9 NULL])",
|
|
61847
|
+
" $ randDiscrete(a, [0.1, 0.2, 0.3, 0.4], 10)",
|
|
61848
|
+
" [[9,00i],[9,00i],[9,00i],[4,5],[9,00i],[1,2,3],[9,00i],[6,7,8],[9,00i],[9,00i]]"
|
|
61849
|
+
]
|
|
61850
|
+
}
|
|
61851
|
+
]
|
|
61852
|
+
}
|
|
61853
|
+
]
|
|
61854
|
+
},
|
|
60769
61855
|
"randExp": {
|
|
60770
61856
|
"title": "randExp",
|
|
60771
61857
|
"type": "function",
|
|
@@ -62634,10 +63720,203 @@
|
|
|
62634
63720
|
{
|
|
62635
63721
|
"type": "text",
|
|
62636
63722
|
"value": [
|
|
62637
|
-
"从句柄中读取给定数量的字符串,并从指定位置开始,把读取结果保存至holder表示的变量中。函数返回实际读取的行数。",
|
|
62638
|
-
"",
|
|
62639
|
-
":doc:`readLines` 函数的每次调用都创建了一个字符串向量并返回。创建字符串向量需要一定的时间开销,所以如果在重复执行函数调用时,能重用相同的向量作为缓冲区的话,可以节约时间。",
|
|
62640
|
-
"readLines! 就是这样的函数,它接受已存在的缓冲区作为数据容器。下述的两个例子读取相同数量的数据 100 次。readLines! 函数比 readLines 函数更快。"
|
|
63723
|
+
"从句柄中读取给定数量的字符串,并从指定位置开始,把读取结果保存至holder表示的变量中。函数返回实际读取的行数。",
|
|
63724
|
+
"",
|
|
63725
|
+
":doc:`readLines` 函数的每次调用都创建了一个字符串向量并返回。创建字符串向量需要一定的时间开销,所以如果在重复执行函数调用时,能重用相同的向量作为缓冲区的话,可以节约时间。",
|
|
63726
|
+
"readLines! 就是这样的函数,它接受已存在的缓冲区作为数据容器。下述的两个例子读取相同数量的数据 100 次。readLines! 函数比 readLines 函数更快。"
|
|
63727
|
+
]
|
|
63728
|
+
}
|
|
63729
|
+
]
|
|
63730
|
+
},
|
|
63731
|
+
{
|
|
63732
|
+
"title": "例子",
|
|
63733
|
+
"type": "example",
|
|
63734
|
+
"children": [
|
|
63735
|
+
{
|
|
63736
|
+
"type": "code",
|
|
63737
|
+
"language": "console",
|
|
63738
|
+
"value": [
|
|
63739
|
+
"",
|
|
63740
|
+
" $ timer(100){",
|
|
63741
|
+
" $ fin = file(\"test.txt\")",
|
|
63742
|
+
" $ do{ y=fin.readLines(1024) } while(y.size()==1024)",
|
|
63743
|
+
" $ fin.close()",
|
|
63744
|
+
" $ };",
|
|
63745
|
+
"",
|
|
63746
|
+
" Time elapsed: 79.511 ms",
|
|
63747
|
+
" ",
|
|
63748
|
+
" $ timer(100){",
|
|
63749
|
+
" $ fin = file(\"test.txt\")",
|
|
63750
|
+
" $ y=array(STRING,1024)",
|
|
63751
|
+
" $ do{ lines = fin.readLines!(y,0,1024) } while(lines==1024)",
|
|
63752
|
+
" $ fin.close()",
|
|
63753
|
+
" $ };",
|
|
63754
|
+
"",
|
|
63755
|
+
" Time elapsed: 56.034 ms",
|
|
63756
|
+
""
|
|
63757
|
+
]
|
|
63758
|
+
},
|
|
63759
|
+
{
|
|
63760
|
+
"type": "text",
|
|
63761
|
+
"value": [
|
|
63762
|
+
".. meta:: ",
|
|
63763
|
+
" :keywords: read"
|
|
63764
|
+
]
|
|
63765
|
+
}
|
|
63766
|
+
]
|
|
63767
|
+
}
|
|
63768
|
+
]
|
|
63769
|
+
},
|
|
63770
|
+
"readObject": {
|
|
63771
|
+
"title": "readObject",
|
|
63772
|
+
"type": "function",
|
|
63773
|
+
"children": [
|
|
63774
|
+
{
|
|
63775
|
+
"title": "语法",
|
|
63776
|
+
"type": "grammer",
|
|
63777
|
+
"children": [
|
|
63778
|
+
{
|
|
63779
|
+
"type": "text",
|
|
63780
|
+
"value": [
|
|
63781
|
+
"readObject(handle)"
|
|
63782
|
+
]
|
|
63783
|
+
}
|
|
63784
|
+
]
|
|
63785
|
+
},
|
|
63786
|
+
{
|
|
63787
|
+
"title": "参数",
|
|
63788
|
+
"type": "parameters",
|
|
63789
|
+
"children": [
|
|
63790
|
+
{
|
|
63791
|
+
"type": "text",
|
|
63792
|
+
"value": [
|
|
63793
|
+
"`handle` 是文件句柄。"
|
|
63794
|
+
]
|
|
63795
|
+
}
|
|
63796
|
+
]
|
|
63797
|
+
},
|
|
63798
|
+
{
|
|
63799
|
+
"title": "详情",
|
|
63800
|
+
"type": "detail",
|
|
63801
|
+
"children": [
|
|
63802
|
+
{
|
|
63803
|
+
"type": "text",
|
|
63804
|
+
"value": [
|
|
63805
|
+
"可以将所有的数据类型读取到句柄中,包括标量、向量、矩阵、集合、字典和表。"
|
|
63806
|
+
]
|
|
63807
|
+
}
|
|
63808
|
+
]
|
|
63809
|
+
},
|
|
63810
|
+
{
|
|
63811
|
+
"title": "例子",
|
|
63812
|
+
"type": "example",
|
|
63813
|
+
"children": [
|
|
63814
|
+
{
|
|
63815
|
+
"type": "code",
|
|
63816
|
+
"language": " console",
|
|
63817
|
+
"value": [
|
|
63818
|
+
""
|
|
63819
|
+
]
|
|
63820
|
+
},
|
|
63821
|
+
{
|
|
63822
|
+
"type": "text",
|
|
63823
|
+
"value": [
|
|
63824
|
+
" $ a1=10.5",
|
|
63825
|
+
" $ a2=1..10",
|
|
63826
|
+
" $ a3=cross(*,1..5,1..10)",
|
|
63827
|
+
" $ a4=set(`IBM`MSFT`GOOG`YHOO)",
|
|
63828
|
+
" $ a5=dict(a4.keys(),125.6 53.2 702.3 39.7)",
|
|
63829
|
+
" $ a6=table(1 2 3 as id, `Jenny`Tom`Jack as name)",
|
|
63830
|
+
" $ a7=(1 2 3, \"hello world!\", 25.6)",
|
|
63831
|
+
"",
|
|
63832
|
+
" $ fout=file(\"test.bin\",\"w\")",
|
|
63833
|
+
" $ fout.writeObject(a1)",
|
|
63834
|
+
" $ fout.writeObject(a2)",
|
|
63835
|
+
" $ fout.writeObject(a3)",
|
|
63836
|
+
" $ fout.writeObject(a4)",
|
|
63837
|
+
" $ fout.writeObject(a5)",
|
|
63838
|
+
" $ fout.writeObject(a6)",
|
|
63839
|
+
" $ fout.writeObject(a7)",
|
|
63840
|
+
" $ fout.close();",
|
|
63841
|
+
"",
|
|
63842
|
+
"上述的脚本把 7 个不同类型的对象写到一个文件中。下述的脚本将这 7 个对象从文件中读取出来,并为每个对象打印一个简短的描述。",
|
|
63843
|
+
""
|
|
63844
|
+
]
|
|
63845
|
+
},
|
|
63846
|
+
{
|
|
63847
|
+
"type": "code",
|
|
63848
|
+
"language": "console",
|
|
63849
|
+
"value": [
|
|
63850
|
+
""
|
|
63851
|
+
]
|
|
63852
|
+
},
|
|
63853
|
+
{
|
|
63854
|
+
"type": "text",
|
|
63855
|
+
"value": [
|
|
63856
|
+
" $ fin = file(\"test.bin\")",
|
|
63857
|
+
" $ for(i in 0:7) print typestr fin.readObject()",
|
|
63858
|
+
" $ fin.close();",
|
|
63859
|
+
"",
|
|
63860
|
+
" DOUBLE",
|
|
63861
|
+
" FAST INT VECTOR",
|
|
63862
|
+
" INT MATRIX",
|
|
63863
|
+
" STRING SET",
|
|
63864
|
+
" STRING->DOUBLE Dictionary",
|
|
63865
|
+
" TABLE",
|
|
63866
|
+
" ANY VECTOR",
|
|
63867
|
+
"",
|
|
63868
|
+
".. meta:: ",
|
|
63869
|
+
" :keywords: read"
|
|
63870
|
+
]
|
|
63871
|
+
}
|
|
63872
|
+
]
|
|
63873
|
+
}
|
|
63874
|
+
]
|
|
63875
|
+
},
|
|
63876
|
+
"readRecord!": {
|
|
63877
|
+
"title": "readRecord!",
|
|
63878
|
+
"type": "function",
|
|
63879
|
+
"children": [
|
|
63880
|
+
{
|
|
63881
|
+
"title": "语法",
|
|
63882
|
+
"type": "grammer",
|
|
63883
|
+
"children": [
|
|
63884
|
+
{
|
|
63885
|
+
"type": "text",
|
|
63886
|
+
"value": [
|
|
63887
|
+
"readRecord!(handle, holder, [offset=0], [length])"
|
|
63888
|
+
]
|
|
63889
|
+
}
|
|
63890
|
+
]
|
|
63891
|
+
},
|
|
63892
|
+
{
|
|
63893
|
+
"title": "参数",
|
|
63894
|
+
"type": "parameters",
|
|
63895
|
+
"children": [
|
|
63896
|
+
{
|
|
63897
|
+
"type": "text",
|
|
63898
|
+
"value": [
|
|
63899
|
+
"`handle` 是文件句柄。",
|
|
63900
|
+
"",
|
|
63901
|
+
"`holder` 是用于保存读取的数据的变量。",
|
|
63902
|
+
"",
|
|
63903
|
+
"`offset` 表示数据保存至holder的起始位置。",
|
|
63904
|
+
"",
|
|
63905
|
+
"`length` 是从文件中读取的行数。"
|
|
63906
|
+
]
|
|
63907
|
+
}
|
|
63908
|
+
]
|
|
63909
|
+
},
|
|
63910
|
+
{
|
|
63911
|
+
"title": "详情",
|
|
63912
|
+
"type": "detail",
|
|
63913
|
+
"children": [
|
|
63914
|
+
{
|
|
63915
|
+
"type": "text",
|
|
63916
|
+
"value": [
|
|
63917
|
+
"readRecord! 函数将二进制文件转换为 DolphinDB 数据对象。DolphinDB 也提供了 :doc:`../w/writeRecord` 函数,用于将 DolphinDB 数据对象转换为二进制文件,以供其它程序使用。",
|
|
63918
|
+
"二进制文件基于行,且每行包含的记录有相同的数据类型和固定的长度。例如,如果一个二进制文件包含了 5 个数据域,分别具有下述数据类型(长度):char(1), boolean(1), short(2), int(4), long(8), 和 double(8),",
|
|
63919
|
+
"那么 readRecord! 函数将把每行视为 24 个字节。类似地,writeRecord 函数把 DolphinDB 对象(例如表或元组)转换为具有上述格式的二进制文件。"
|
|
62641
63920
|
]
|
|
62642
63921
|
}
|
|
62643
63922
|
]
|
|
@@ -62651,22 +63930,19 @@
|
|
|
62651
63930
|
"language": "console",
|
|
62652
63931
|
"value": [
|
|
62653
63932
|
"",
|
|
62654
|
-
"
|
|
62655
|
-
"
|
|
62656
|
-
"
|
|
62657
|
-
"
|
|
62658
|
-
"
|
|
62659
|
-
"",
|
|
62660
|
-
" Time elapsed: 79.511 ms",
|
|
62661
|
-
" ",
|
|
62662
|
-
" $ timer(100){",
|
|
62663
|
-
" $ fin = file(\"test.txt\")",
|
|
62664
|
-
" $ y=array(STRING,1024)",
|
|
62665
|
-
" $ do{ lines = fin.readLines!(y,0,1024) } while(lines==1024)",
|
|
62666
|
-
" $ fin.close()",
|
|
62667
|
-
" $ };",
|
|
63933
|
+
" // 创建一个文件句柄,用于读取记录。二进制文件 a.bin 包含了 1000 条记录。",
|
|
63934
|
+
" $ f=file(\"c:/DB/a.bin\")",
|
|
63935
|
+
" $ t=table(1000:0, `PERMNO`PRC`VOL`SHROUT, `int`double`int`double)",
|
|
63936
|
+
" $ f.readRecord!(t);",
|
|
63937
|
+
" 1000",
|
|
62668
63938
|
"",
|
|
62669
|
-
"
|
|
63939
|
+
" // 类似地,我们可以将一个二进制文件读入一个 DolphinDB 元组对象",
|
|
63940
|
+
" $ f=file(\"c:/DB/a.bin\")",
|
|
63941
|
+
" $ t=loop(array, [int, double, int, double], 0, 500) ",
|
|
63942
|
+
" // 创建具有 4 个数组元素的元组 t。每一个数组的长度是 500",
|
|
63943
|
+
" $ f.readRecord!(t, 0, 500); ",
|
|
63944
|
+
" // 读取前 500 行",
|
|
63945
|
+
" 500",
|
|
62670
63946
|
""
|
|
62671
63947
|
]
|
|
62672
63948
|
},
|
|
@@ -62681,8 +63957,8 @@
|
|
|
62681
63957
|
}
|
|
62682
63958
|
]
|
|
62683
63959
|
},
|
|
62684
|
-
"
|
|
62685
|
-
"title": "
|
|
63960
|
+
"rebalanceChunksAmongDataNodes": {
|
|
63961
|
+
"title": "rebalanceChunksAmongDataNodes",
|
|
62686
63962
|
"type": "function",
|
|
62687
63963
|
"children": [
|
|
62688
63964
|
{
|
|
@@ -62692,7 +63968,7 @@
|
|
|
62692
63968
|
{
|
|
62693
63969
|
"type": "text",
|
|
62694
63970
|
"value": [
|
|
62695
|
-
"
|
|
63971
|
+
"rebalanceChunksAmongDataNodes([exec = false])"
|
|
62696
63972
|
]
|
|
62697
63973
|
}
|
|
62698
63974
|
]
|
|
@@ -62704,7 +63980,7 @@
|
|
|
62704
63980
|
{
|
|
62705
63981
|
"type": "text",
|
|
62706
63982
|
"value": [
|
|
62707
|
-
"`
|
|
63983
|
+
"`exec` 布尔值,表示是否进行节点间的数据平衡。默认值为 false,表示不进行数据平衡。"
|
|
62708
63984
|
]
|
|
62709
63985
|
}
|
|
62710
63986
|
]
|
|
@@ -62716,7 +63992,19 @@
|
|
|
62716
63992
|
{
|
|
62717
63993
|
"type": "text",
|
|
62718
63994
|
"value": [
|
|
62719
|
-
"
|
|
63995
|
+
"在所有节点间平衡数据,以保证集群最佳性能。通常用于在集群中增加节点后。只能由管理员在控制节点上执行。",
|
|
63996
|
+
"",
|
|
63997
|
+
"返回一个表,包含以下列:",
|
|
63998
|
+
"",
|
|
63999
|
+
"================== =================================================",
|
|
64000
|
+
"列名 含义",
|
|
64001
|
+
"================== =================================================",
|
|
64002
|
+
"chunkId chunk 的唯一标识",
|
|
64003
|
+
"srcNode 源节点的别名",
|
|
64004
|
+
"destNode 目标节点的别名",
|
|
64005
|
+
"================== =================================================",
|
|
64006
|
+
"",
|
|
64007
|
+
"调用该函数后,可以在控制节点上执行 :doc:`/FunctionsandCommands/FunctionReferences/g/getRecoveryTaskStatus` 查看任务执行的状态。"
|
|
62720
64008
|
]
|
|
62721
64009
|
}
|
|
62722
64010
|
]
|
|
@@ -62725,70 +64013,34 @@
|
|
|
62725
64013
|
"title": "例子",
|
|
62726
64014
|
"type": "example",
|
|
62727
64015
|
"children": [
|
|
62728
|
-
{
|
|
62729
|
-
"type": "code",
|
|
62730
|
-
"language": " console",
|
|
62731
|
-
"value": [
|
|
62732
|
-
""
|
|
62733
|
-
]
|
|
62734
|
-
},
|
|
62735
|
-
{
|
|
62736
|
-
"type": "text",
|
|
62737
|
-
"value": [
|
|
62738
|
-
" $ a1=10.5",
|
|
62739
|
-
" $ a2=1..10",
|
|
62740
|
-
" $ a3=cross(*,1..5,1..10)",
|
|
62741
|
-
" $ a4=set(`IBM`MSFT`GOOG`YHOO)",
|
|
62742
|
-
" $ a5=dict(a4.keys(),125.6 53.2 702.3 39.7)",
|
|
62743
|
-
" $ a6=table(1 2 3 as id, `Jenny`Tom`Jack as name)",
|
|
62744
|
-
" $ a7=(1 2 3, \"hello world!\", 25.6)",
|
|
62745
|
-
"",
|
|
62746
|
-
" $ fout=file(\"test.bin\",\"w\")",
|
|
62747
|
-
" $ fout.writeObject(a1)",
|
|
62748
|
-
" $ fout.writeObject(a2)",
|
|
62749
|
-
" $ fout.writeObject(a3)",
|
|
62750
|
-
" $ fout.writeObject(a4)",
|
|
62751
|
-
" $ fout.writeObject(a5)",
|
|
62752
|
-
" $ fout.writeObject(a6)",
|
|
62753
|
-
" $ fout.writeObject(a7)",
|
|
62754
|
-
" $ fout.close();",
|
|
62755
|
-
"",
|
|
62756
|
-
"上述的脚本把 7 个不同类型的对象写到一个文件中。下述的脚本将这 7 个对象从文件中读取出来,并为每个对象打印一个简短的描述。",
|
|
62757
|
-
""
|
|
62758
|
-
]
|
|
62759
|
-
},
|
|
62760
64016
|
{
|
|
62761
64017
|
"type": "code",
|
|
62762
64018
|
"language": "console",
|
|
62763
64019
|
"value": [
|
|
64020
|
+
"",
|
|
64021
|
+
" $ rebalanceChunksAmongDataNodes()",
|
|
62764
64022
|
""
|
|
62765
64023
|
]
|
|
62766
64024
|
},
|
|
62767
64025
|
{
|
|
62768
64026
|
"type": "text",
|
|
62769
64027
|
"value": [
|
|
62770
|
-
"
|
|
62771
|
-
"
|
|
62772
|
-
"
|
|
62773
|
-
"",
|
|
62774
|
-
"
|
|
62775
|
-
"
|
|
62776
|
-
" INT MATRIX",
|
|
62777
|
-
" STRING SET",
|
|
62778
|
-
" STRING->DOUBLE Dictionary",
|
|
62779
|
-
" TABLE",
|
|
62780
|
-
" ANY VECTOR",
|
|
64028
|
+
"==================================== ======= ========",
|
|
64029
|
+
"ChunkId srcNode destNode",
|
|
64030
|
+
"==================================== ======= ========",
|
|
64031
|
+
"99279094-ca12-3b87-48b6-520cbb986f39 node1 node2",
|
|
64032
|
+
"45f612b8-42f5-aebd-4cef-e522b6ae1fc8 node1 node2\t",
|
|
64033
|
+
"==================================== ======= ========",
|
|
62781
64034
|
"",
|
|
62782
|
-
"
|
|
62783
|
-
" :keywords: read"
|
|
64035
|
+
" "
|
|
62784
64036
|
]
|
|
62785
64037
|
}
|
|
62786
64038
|
]
|
|
62787
64039
|
}
|
|
62788
64040
|
]
|
|
62789
64041
|
},
|
|
62790
|
-
"
|
|
62791
|
-
"title": "
|
|
64042
|
+
"rebalanceChunksWithinDataNode": {
|
|
64043
|
+
"title": "rebalanceChunksWithinDataNode",
|
|
62792
64044
|
"type": "function",
|
|
62793
64045
|
"children": [
|
|
62794
64046
|
{
|
|
@@ -62798,7 +64050,7 @@
|
|
|
62798
64050
|
{
|
|
62799
64051
|
"type": "text",
|
|
62800
64052
|
"value": [
|
|
62801
|
-
"
|
|
64053
|
+
"rebalanceChunksWithinDataNode(nodeAlias, [exec=false])"
|
|
62802
64054
|
]
|
|
62803
64055
|
}
|
|
62804
64056
|
]
|
|
@@ -62810,13 +64062,9 @@
|
|
|
62810
64062
|
{
|
|
62811
64063
|
"type": "text",
|
|
62812
64064
|
"value": [
|
|
62813
|
-
"`
|
|
62814
|
-
"",
|
|
62815
|
-
"`holder` 是用于保存读取的数据的变量。",
|
|
62816
|
-
"",
|
|
62817
|
-
"`offset` 表示数据保存至holder的起始位置。",
|
|
64065
|
+
"`nodeAlias` 字符串,表示数据节点的别名。",
|
|
62818
64066
|
"",
|
|
62819
|
-
"`
|
|
64067
|
+
"`exec` 布尔值,表示是否在节点内进行数据平衡。默认值为 false,表示不进行数据平衡。"
|
|
62820
64068
|
]
|
|
62821
64069
|
}
|
|
62822
64070
|
]
|
|
@@ -62828,9 +64076,20 @@
|
|
|
62828
64076
|
{
|
|
62829
64077
|
"type": "text",
|
|
62830
64078
|
"value": [
|
|
62831
|
-
"
|
|
62832
|
-
"
|
|
62833
|
-
"
|
|
64079
|
+
"一个节点内部增加磁盘卷后,需要调整现有磁盘卷上的数据量,使各个磁盘卷上的数据量达到平衡。该函数用于平衡一个数据节点内各磁盘卷间的数据,返回一个表,显示各磁盘卷间数据平衡计划。",
|
|
64080
|
+
"若 *exec* 为 true,则进行数据平衡;若 *exec* 为 false,则不进行数据平衡。它只能由管理员在控制节点上执行。",
|
|
64081
|
+
"",
|
|
64082
|
+
"返回结果包含以下列:",
|
|
64083
|
+
"",
|
|
64084
|
+
"================== =================================================",
|
|
64085
|
+
"列名 含义",
|
|
64086
|
+
"================== =================================================",
|
|
64087
|
+
"chunkId chunk 的唯一标识",
|
|
64088
|
+
"srcVolume 源磁盘卷",
|
|
64089
|
+
"destVolume 目标磁盘卷",
|
|
64090
|
+
"================== =================================================",
|
|
64091
|
+
"",
|
|
64092
|
+
"调用该函数进行数据平衡后,可以在控制节点上执行 :doc:`/FunctionsandCommands/FunctionReferences/g/getRecoveryTaskStatus` 查看任务执行的状态。"
|
|
62834
64093
|
]
|
|
62835
64094
|
}
|
|
62836
64095
|
]
|
|
@@ -62844,27 +64103,18 @@
|
|
|
62844
64103
|
"language": "console",
|
|
62845
64104
|
"value": [
|
|
62846
64105
|
"",
|
|
62847
|
-
"
|
|
62848
|
-
" $ f=file(\"c:/DB/a.bin\")",
|
|
62849
|
-
" $ t=table(1000:0, `PERMNO`PRC`VOL`SHROUT, `int`double`int`double)",
|
|
62850
|
-
" $ f.readRecord!(t);",
|
|
62851
|
-
" 1000",
|
|
62852
|
-
"",
|
|
62853
|
-
" // 类似地,我们可以将一个二进制文件读入一个 DolphinDB 元组对象",
|
|
62854
|
-
" $ f=file(\"c:/DB/a.bin\")",
|
|
62855
|
-
" $ t=loop(array, [int, double, int, double], 0, 500) ",
|
|
62856
|
-
" // 创建具有 4 个数组元素的元组 t。每一个数组的长度是 500",
|
|
62857
|
-
" $ f.readRecord!(t, 0, 500); ",
|
|
62858
|
-
" // 读取前 500 行",
|
|
62859
|
-
" 500",
|
|
64106
|
+
" $ rebalanceChunksWithinDataNode(\"node1\")",
|
|
62860
64107
|
""
|
|
62861
64108
|
]
|
|
62862
64109
|
},
|
|
62863
64110
|
{
|
|
62864
64111
|
"type": "text",
|
|
62865
64112
|
"value": [
|
|
62866
|
-
"
|
|
62867
|
-
"
|
|
64113
|
+
"+-------------------------------------+-------------------+------------------+",
|
|
64114
|
+
"|ChunkId |srcVolume |destVolume |",
|
|
64115
|
+
"+=====================================+===================+==================+",
|
|
64116
|
+
"|82c6eb6c-36ee-b1b6-4a86-ca24d9faaa25 | /hdd/hdd1/volumes |/hdd/hdd2/volumes |\t",
|
|
64117
|
+
"+-------------------------------------+-------------------+------------------+"
|
|
62868
64118
|
]
|
|
62869
64119
|
}
|
|
62870
64120
|
]
|
|
@@ -65007,9 +66257,7 @@
|
|
|
65007
66257
|
"",
|
|
65008
66258
|
"`dateColumn` 和 `timeColumn` 是一个字符串,表示SQL查询的表对象的日期列和时间列。dateColumn的每一天会产生一个数据源。dateColumn必须是SQL查询的表对象的分区列之一。如果没有指定 dateColumn与 timeColumn,原数据表的第一列将会作为 dateColumn。",
|
|
65009
66259
|
"",
|
|
65010
|
-
"`timeRepartitionSchema` 是一个TIME或NANOTIME类型的向量。如果指定了 timeColumn,timeRepartitionSchema
|
|
65011
|
-
"",
|
|
65012
|
-
"`timeRepartitionSchema` 为[t1, t2, t3],那么将每天的数据进一步划分为4个数据源:[00:00:00.000,t1), [t1,t2), [t2,t3) 和 [t3,23:59:59.999)。"
|
|
66260
|
+
"`timeRepartitionSchema` 是一个TIME或NANOTIME类型的向量。如果指定了 timeColumn,timeRepartitionSchema可用于划分更小粒度的数据源。如果为[t1, t2, t3],那么将每天的数据进一步划分为4个数据源:[00:00:00.000,t1), [t1,t2), [t2,t3) 和 [t3,23:59:59.999)。"
|
|
65013
66261
|
]
|
|
65014
66262
|
}
|
|
65015
66263
|
]
|
|
@@ -65186,7 +66434,7 @@
|
|
|
65186
66434
|
{
|
|
65187
66435
|
"type": "text",
|
|
65188
66436
|
"value": [
|
|
65189
|
-
"resample(X, rule, func)"
|
|
66437
|
+
"resample(X, rule, func, [closed], [label], [origin='start_day'])"
|
|
65190
66438
|
]
|
|
65191
66439
|
}
|
|
65192
66440
|
]
|
|
@@ -65224,11 +66472,37 @@
|
|
|
65224
66472
|
"\"BA\" businessYearEnd",
|
|
65225
66473
|
"\"BAS\" businessYearBegin",
|
|
65226
66474
|
"\"D\" date",
|
|
66475
|
+
"\"H\" hourOfDay",
|
|
66476
|
+
"\"U\" microsecond",
|
|
66477
|
+
"\"L\" millisecond",
|
|
66478
|
+
"\"min\" minuteOfHour",
|
|
66479
|
+
"\"N\" nanosecond",
|
|
66480
|
+
"\"S\" secondOfMinute",
|
|
65227
66481
|
"============= ===================",
|
|
65228
66482
|
"",
|
|
65229
66483
|
"`rule` 字符串亦可配合使用数字,例如 \"2M\" 表示频率为每两个月月末。",
|
|
65230
66484
|
"",
|
|
65231
|
-
"`func`
|
|
66485
|
+
"`func` 一个聚合函数。",
|
|
66486
|
+
"",
|
|
66487
|
+
"`closed` 字符串,表示分组区间哪一个边界是闭合的。",
|
|
66488
|
+
"",
|
|
66489
|
+
"* *rule* 为 'M', 'A', 'Q', 'BM', 'BA', 'BQ' 和 'W' 时,*closed* 的默认取值为 'right' ,否则,*closed* 的默认取值为 'left'。",
|
|
66490
|
+
"* *origin* 取 'end' 或者 'end_day' 时,*closed* 的默认值为 'right'。",
|
|
66491
|
+
"* 1.30.18/2.00.6 版本,当 *rule* 的精度为天以上时,不支持使用默认值以外的选项。",
|
|
66492
|
+
"",
|
|
66493
|
+
"`label` 字符串,表示将分组区间的哪一个边界作为 *label* 输出。",
|
|
66494
|
+
"",
|
|
66495
|
+
"* *rule* 为 'M', 'A', 'Q', 'BM', 'BA', 'BQ' 和 'W' 时,*label* 的默认取值为 'right' ,否则,*label* 的默认取值为 'left'。",
|
|
66496
|
+
"* *origin* 取 'end' 或者 'end_day' 时,*label* 的默认值为 'right'。",
|
|
66497
|
+
"* 1.30.18/2.00.6 版本,当 *rule* 的精度为天以上时,不支持使用默认值以外的选项。",
|
|
66498
|
+
"",
|
|
66499
|
+
"`origin` 字符串或与 *X* 具有相同时间类型的标量,表示基于时间戳调整分组。*origin* 的取值为 'epoch', start', 'start_day', 'end', 'end_day' 或自定义的时间对象,默认值为 'start_day'。",
|
|
66500
|
+
"",
|
|
66501
|
+
"* 'epoch':分组起始点为1970-01-01。",
|
|
66502
|
+
"* 'start':分组起始点为时间序列的第一个值。",
|
|
66503
|
+
"* 'start_day':分组起始点是时间序列的第一个值对应日期的午夜零点。",
|
|
66504
|
+
"* 'end':分组起始点是时间序列的最后一个时间戳。",
|
|
66505
|
+
"* 'end_day':分组起始点是时间序列的最后一个时间戳对应日期的午夜24点(即下一日的零点)。"
|
|
65232
66506
|
]
|
|
65233
66507
|
}
|
|
65234
66508
|
]
|
|
@@ -65309,7 +66583,98 @@
|
|
|
65309
66583
|
"|2000.07.31| |",
|
|
65310
66584
|
"+----------+----+",
|
|
65311
66585
|
"|2000.09.30|8 |",
|
|
65312
|
-
"+----------+----+"
|
|
66586
|
+
"+----------+----+",
|
|
66587
|
+
""
|
|
66588
|
+
]
|
|
66589
|
+
},
|
|
66590
|
+
{
|
|
66591
|
+
"type": "code",
|
|
66592
|
+
"language": "console",
|
|
66593
|
+
"value": [
|
|
66594
|
+
"",
|
|
66595
|
+
" $ index = temporalAdd(2022.01.01 00:00:00,1..8,`m)",
|
|
66596
|
+
" $ s = indexedSeries(index, 1..8)",
|
|
66597
|
+
" $ s.resample(rule=`3min, func=sum);",
|
|
66598
|
+
""
|
|
66599
|
+
]
|
|
66600
|
+
},
|
|
66601
|
+
{
|
|
66602
|
+
"type": "text",
|
|
66603
|
+
"value": [
|
|
66604
|
+
"=================== ====",
|
|
66605
|
+
"label\t col1",
|
|
66606
|
+
"=================== ====",
|
|
66607
|
+
"2022.01.01T00:00:00\t3",
|
|
66608
|
+
"2022.01.01T00:03:00\t12",
|
|
66609
|
+
"2022.01.01T00:06:00\t21 ",
|
|
66610
|
+
"=================== ====",
|
|
66611
|
+
""
|
|
66612
|
+
]
|
|
66613
|
+
},
|
|
66614
|
+
{
|
|
66615
|
+
"type": "code",
|
|
66616
|
+
"language": "console",
|
|
66617
|
+
"value": [
|
|
66618
|
+
"",
|
|
66619
|
+
" $ s.resample(rule=`3min, func=sum, closed=`right);",
|
|
66620
|
+
""
|
|
66621
|
+
]
|
|
66622
|
+
},
|
|
66623
|
+
{
|
|
66624
|
+
"type": "text",
|
|
66625
|
+
"value": [
|
|
66626
|
+
"=================== ====",
|
|
66627
|
+
"label\t col1",
|
|
66628
|
+
"=================== ====",
|
|
66629
|
+
"2022.01.01T00:00:00\t6",
|
|
66630
|
+
"2022.01.01T00:03:00\t15",
|
|
66631
|
+
"2022.01.01T00:06:00\t15",
|
|
66632
|
+
"=================== ====",
|
|
66633
|
+
""
|
|
66634
|
+
]
|
|
66635
|
+
},
|
|
66636
|
+
{
|
|
66637
|
+
"type": "code",
|
|
66638
|
+
"language": "console",
|
|
66639
|
+
"value": [
|
|
66640
|
+
"",
|
|
66641
|
+
" $ s.resample(rule=`3min, func=sum, closed=`right,origin=`end);",
|
|
66642
|
+
""
|
|
66643
|
+
]
|
|
66644
|
+
},
|
|
66645
|
+
{
|
|
66646
|
+
"type": "text",
|
|
66647
|
+
"value": [
|
|
66648
|
+
"=================== ====",
|
|
66649
|
+
"label\t col1",
|
|
66650
|
+
"=================== ====",
|
|
66651
|
+
"2022.01.01T00:02:00\t1",
|
|
66652
|
+
"2022.01.01T00:05:00\t9",
|
|
66653
|
+
"2022.01.01T00:08:00\t18",
|
|
66654
|
+
"2022.01.01T00:11:00\t8",
|
|
66655
|
+
"=================== ====",
|
|
66656
|
+
""
|
|
66657
|
+
]
|
|
66658
|
+
},
|
|
66659
|
+
{
|
|
66660
|
+
"type": "code",
|
|
66661
|
+
"language": "console",
|
|
66662
|
+
"value": [
|
|
66663
|
+
"",
|
|
66664
|
+
" $ s.resample(rule=`3min, func=sum,origin=2022.10.01 00:00:10)",
|
|
66665
|
+
""
|
|
66666
|
+
]
|
|
66667
|
+
},
|
|
66668
|
+
{
|
|
66669
|
+
"type": "text",
|
|
66670
|
+
"value": [
|
|
66671
|
+
"=================== ====",
|
|
66672
|
+
"label col1",
|
|
66673
|
+
"=================== ====",
|
|
66674
|
+
"2022.01.01T00:00:10\t6",
|
|
66675
|
+
"2022.01.01T00:03:10\t15",
|
|
66676
|
+
"2022.01.01T00:06:10\t15",
|
|
66677
|
+
"=================== ===="
|
|
65313
66678
|
]
|
|
65314
66679
|
}
|
|
65315
66680
|
]
|
|
@@ -65339,9 +66704,9 @@
|
|
|
65339
66704
|
{
|
|
65340
66705
|
"type": "text",
|
|
65341
66706
|
"value": [
|
|
65342
|
-
"`userId`
|
|
66707
|
+
"`userId` 表示用户名的字符串。",
|
|
65343
66708
|
"",
|
|
65344
|
-
"`newPwd`
|
|
66709
|
+
"`newPwd` 表示用户新密码的字符串,长度范围为 6~20 个字符。"
|
|
65345
66710
|
]
|
|
65346
66711
|
}
|
|
65347
66712
|
]
|
|
@@ -65385,7 +66750,7 @@
|
|
|
65385
66750
|
{
|
|
65386
66751
|
"type": "text",
|
|
65387
66752
|
"value": [
|
|
65388
|
-
"resetRecoveryWorkerNum(
|
|
66753
|
+
"resetRecoveryWorkerNum(newWorkerNum)"
|
|
65389
66754
|
]
|
|
65390
66755
|
}
|
|
65391
66756
|
]
|
|
@@ -65397,7 +66762,7 @@
|
|
|
65397
66762
|
{
|
|
65398
66763
|
"type": "text",
|
|
65399
66764
|
"value": [
|
|
65400
|
-
"`
|
|
66765
|
+
"`newWorkerNum` 正整数,指定用于 chunk 恢复的工作线程数。"
|
|
65401
66766
|
]
|
|
65402
66767
|
}
|
|
65403
66768
|
]
|
|
@@ -69720,7 +71085,7 @@
|
|
|
69720
71085
|
{
|
|
69721
71086
|
"type": "text",
|
|
69722
71087
|
"value": [
|
|
69723
|
-
"`
|
|
71088
|
+
"`script` 是字符串,表示需要执行的脚本。"
|
|
69724
71089
|
]
|
|
69725
71090
|
}
|
|
69726
71091
|
]
|
|
@@ -72870,7 +74235,7 @@
|
|
|
72870
74235
|
{
|
|
72871
74236
|
"type": "text",
|
|
72872
74237
|
"value": [
|
|
72873
|
-
"setRetentionPolicy(dbHanle, retentionHours, [retentionDimension])"
|
|
74238
|
+
"setRetentionPolicy(dbHanle, retentionHours, [retentionDimension], [hoursToColdVolume])"
|
|
72874
74239
|
]
|
|
72875
74240
|
}
|
|
72876
74241
|
]
|
|
@@ -72882,11 +74247,15 @@
|
|
|
72882
74247
|
{
|
|
72883
74248
|
"type": "text",
|
|
72884
74249
|
"value": [
|
|
72885
|
-
"`dbHandle`
|
|
74250
|
+
"`dbHandle` 分布式数据库的句柄。数据库的分区方案必须包含DATE类型或DATEHOUR类型。",
|
|
74251
|
+
"",
|
|
74252
|
+
"`retentionHours` 正整数,表示数据保留时间,单位是小时。",
|
|
72886
74253
|
"",
|
|
72887
|
-
"`
|
|
74254
|
+
"`retentionDimension` 整数,表示时间分区所在的层次。默认值是0,表示第一层分区是按时间分区。",
|
|
72888
74255
|
"",
|
|
72889
|
-
"`
|
|
74256
|
+
"`hoursToColdVolume` 正整数,表示 volumes 数据的保留时间,单位是小时。存储在 volumes 中的数据,经过 hoursToColdVolume 指定的时间后,将会自动迁移至 coldVolumes(该配置项需在配置文件中预先指定)。",
|
|
74257
|
+
"",
|
|
74258
|
+
"注意:必须满足 *retentionHours* - *hoursToColdVolume* > 7 * 24(即 7 天)"
|
|
72890
74259
|
]
|
|
72891
74260
|
}
|
|
72892
74261
|
]
|
|
@@ -72898,10 +74267,13 @@
|
|
|
72898
74267
|
{
|
|
72899
74268
|
"type": "text",
|
|
72900
74269
|
"value": [
|
|
72901
|
-
"
|
|
74270
|
+
"设置数据保留策略以及 :doc:`/DatabaseandDistributedComputing/Database/TieredStorage` 策略。若用户只通过该函数配置分级存储策略,建议将参数 *retentionHours* 指定为一个尽可能大的值。",
|
|
74271
|
+
"",
|
|
74272
|
+
"数据库会根据当前系统的机器时间,保留数据时间戳为最近 *retentionHours* 小时的数据。其中最新 *hoursToColdVolume* 小时的数据将继续存储在 volumes 中。在 [当前时间 - hoursToColdVolume - 10天,当前时间 - hoursToColdVolume) 范围内的数据将被迁移到 *coldVolumes*。若 *coldVolumes* 配置了多个路径,则数据将随机分布在各个存储路径下 。",
|
|
72902
74273
|
"",
|
|
72903
|
-
"
|
|
72904
|
-
"
|
|
74274
|
+
"对于保留时间外的数据,只会删除 [当前时间 - retentionHours - 10 天, 当前时间 - retentionHours) 范围的数据。若需要删除之前的数据,可以调用 :doc:`../d/dropPartition` 函数实现。",
|
|
74275
|
+
"",
|
|
74276
|
+
"注意:该函数只能对分布式数据库使用。",
|
|
72905
74277
|
"",
|
|
72906
74278
|
"可以通过 :doc:`../../FunctionReferences/s/schema` 函数查看数据库的数据保留时间。"
|
|
72907
74279
|
]
|
|
@@ -72918,15 +74290,22 @@
|
|
|
72918
74290
|
"value": [
|
|
72919
74291
|
"",
|
|
72920
74292
|
" $ db=database(\"dfs://db1\",VALUE,2019.06.01..date(now()))",
|
|
72921
|
-
" $ retentionHour=
|
|
72922
|
-
" $
|
|
74293
|
+
" $ retentionHour=9*24",
|
|
74294
|
+
" $ hoursToColdVolume=1*24",
|
|
74295
|
+
" $ setRetentionPolicy(db,retentionHour,0, hoursToColdVolume);",
|
|
72923
74296
|
"",
|
|
72924
74297
|
" $ schema(db);",
|
|
72925
|
-
" partitionSchema->[
|
|
72926
|
-
" databaseDir->dfs://db1",
|
|
74298
|
+
" partitionSchema->[2022.05.05,2022.05.04,2022.05.03,2022.05.02,2022.05.01,2022.04.30,2022.04.29,2022.04.28,2022.04.27,2022.04.26,...]",
|
|
72927
74299
|
" partitionSites->",
|
|
74300
|
+
" partitionTypeName->VALUE",
|
|
74301
|
+
" hoursToColdVolume->24",
|
|
74302
|
+
" atomic->TRANS",
|
|
74303
|
+
" databaseDir->dfs://db1",
|
|
74304
|
+
" engineType->OLAP",
|
|
74305
|
+
" chunkGranularity->TABLE",
|
|
72928
74306
|
" retentionDimension->0",
|
|
72929
|
-
"
|
|
74307
|
+
" partitionType->1",
|
|
74308
|
+
" retentionHours->216",
|
|
72930
74309
|
""
|
|
72931
74310
|
]
|
|
72932
74311
|
},
|
|
@@ -77291,9 +78670,15 @@
|
|
|
77291
78670
|
"",
|
|
77292
78671
|
"根据业务场景设计到的计算引擎, *metrics* 的改写规则如下:",
|
|
77293
78672
|
"",
|
|
78673
|
+
"注意:",
|
|
78674
|
+
"",
|
|
78675
|
+
"(1)若 metrics 中包含用户自定义函数,则引擎解析器会按下文的分解原则将函数体进行分解,将各分解得到的操作分发给对应引擎进行处理。",
|
|
78676
|
+
"",
|
|
78677
|
+
"(2)若用户自定义函数用 @state 进行标识,则引擎解析器会将其分配给响应式状态引擎处理。",
|
|
78678
|
+
"",
|
|
77294
78679
|
"\\1. 引擎分解标识",
|
|
77295
78680
|
"",
|
|
77296
|
-
"* 若指标中的某一步操作需要使用横截面引擎,需改成以 “row开头” 的函数作为标识,若不添加 row
|
|
78681
|
+
"* 若指标中的某一步操作需要使用横截面引擎,需改成以 “row开头” 的函数作为标识,若不添加 row 则该操作默认在响应式状态引擎处理。横截面引擎的标识函数如下:",
|
|
77297
78682
|
"",
|
|
77298
78683
|
"::",
|
|
77299
78684
|
"",
|
|
@@ -77307,7 +78692,7 @@
|
|
|
77307
78692
|
"",
|
|
77308
78693
|
" rolling(func, funcArgs, window, [step=1], [fill='none']) ",
|
|
77309
78694
|
"",
|
|
77310
|
-
"*
|
|
78695
|
+
"* 其他指标中的操作默认在响应式状态引擎中处理。",
|
|
77311
78696
|
" ",
|
|
77312
78697
|
"\\2. 中间引擎输入表结构",
|
|
77313
78698
|
"",
|
|
@@ -77414,7 +78799,7 @@
|
|
|
77414
78799
|
" //构建计算因子",
|
|
77415
78800
|
" $ metrics=<[sym, rowRank(wqAlpha1TS(close), percent=true)- 0.5]>",
|
|
77416
78801
|
"",
|
|
77417
|
-
" $ streamEngine=streamEngineParser(name=`alpha1_parser, metrics=metrics, dummyTable=input, outputTable=resultTable, keyColumn=`sym, timeColumn=`time, triggeringPattern='keyCount', triggeringInterval=
|
|
78802
|
+
" $ streamEngine=streamEngineParser(name=`alpha1_parser, metrics=metrics, dummyTable=input, outputTable=resultTable, keyColumn=`sym, timeColumn=`time, triggeringPattern='keyCount', triggeringInterval=3000)",
|
|
77418
78803
|
" $ streamEngine.append!(data)",
|
|
77419
78804
|
"",
|
|
77420
78805
|
" $ dropStreamEngine(\"alpha1_parser0\")",
|
|
@@ -77429,6 +78814,30 @@
|
|
|
77429
78814
|
"title": "streamFilter",
|
|
77430
78815
|
"type": "function",
|
|
77431
78816
|
"children": [
|
|
78817
|
+
{
|
|
78818
|
+
"title": "详情",
|
|
78819
|
+
"type": "detail",
|
|
78820
|
+
"children": [
|
|
78821
|
+
{
|
|
78822
|
+
"type": "text",
|
|
78823
|
+
"value": [
|
|
78824
|
+
"创建流数据过滤引擎,对输入引擎的数据进行过滤和分发处理,返回一个表对象。",
|
|
78825
|
+
"",
|
|
78826
|
+
"该引擎的处理流程包含以下两个步骤:",
|
|
78827
|
+
"",
|
|
78828
|
+
"\\1. 根据 *filter* 指定的规则对流表进行过滤。",
|
|
78829
|
+
"",
|
|
78830
|
+
"\\2. 过滤后的数据按照时间顺序以表的形式分发到不同的 handler 里进行处理。",
|
|
78831
|
+
"",
|
|
78832
|
+
"注意:",
|
|
78833
|
+
"",
|
|
78834
|
+
"* 1.30.17 及 2.00.5 版本开始,DolphinDB 支持通过 :doc:`../r/replay` 函数将多个结构不同的流数据表,回放(序列化)到一个流表里,这个流表被称为异构流表。streamFilter 函数用于解析(反序列化)和过滤异构流表的数据并进行分发处理。",
|
|
78835
|
+
"* 1.30.18 及 2.00.6 版本开始,streamFilter 函数支持过滤普通流表数据,并进行分发处理。",
|
|
78836
|
+
""
|
|
78837
|
+
]
|
|
78838
|
+
}
|
|
78839
|
+
]
|
|
78840
|
+
},
|
|
77432
78841
|
{
|
|
77433
78842
|
"title": "语法",
|
|
77434
78843
|
"type": "grammer",
|
|
@@ -77436,7 +78845,7 @@
|
|
|
77436
78845
|
{
|
|
77437
78846
|
"type": "text",
|
|
77438
78847
|
"value": [
|
|
77439
|
-
"streamFilter(name, dummyTable, filter, msgSchema)"
|
|
78848
|
+
"streamFilter(name, dummyTable, filter, [msgSchema], [timeColumn], [conditionColumn])"
|
|
77440
78849
|
]
|
|
77441
78850
|
}
|
|
77442
78851
|
]
|
|
@@ -77456,30 +78865,28 @@
|
|
|
77456
78865
|
"",
|
|
77457
78866
|
"字典可选的 key-value 说明如下:",
|
|
77458
78867
|
"",
|
|
77459
|
-
"* 'timeRange':可选字段,一个数据对或包含多个数据对的 tuple
|
|
77460
|
-
"* 'condition'
|
|
78868
|
+
"* 'timeRange':可选字段,一个数据对或包含多个数据对的 tuple。以指定的 *timeRange* 对 *timeColumn* 进行过滤。注意:若分发普通流表,则 *timeRange* 必须和 *timeColumn* 的数据类型一致;异构流表无该限制。",
|
|
78869
|
+
"* 'condition':表示过滤条件。",
|
|
78870
|
+
"",
|
|
78871
|
+
" * 若分发异构流表,则 'condition' 是一个字符串,且必须是 replay 参数 *inputTables* 的键值(表的标识)。用于过滤出异构表中具有 *condition* 标识的数据。",
|
|
78872
|
+
" * 若分发普通流表,则 'condition' 是一个字符串标量或向量,且必须是 `conditionColumn` 指定列的元素。用于过滤出表 *conditionColumn* 列中满足 *condition* 的数据。",
|
|
78873
|
+
"",
|
|
77461
78874
|
"* 'handler':一元函数或表对象(包括流数据引擎返回的表对象)。",
|
|
77462
78875
|
"",
|
|
77463
78876
|
" * 如果它是一元函数,它唯一的参数是经过解析和过滤后的数据表。",
|
|
77464
78877
|
" * 如果它是表对象,经过解析和过滤后的数据会直接插入到该表中。",
|
|
77465
78878
|
"",
|
|
77466
|
-
"`msgSchema`
|
|
77467
|
-
|
|
77468
|
-
|
|
77469
|
-
|
|
77470
|
-
|
|
77471
|
-
|
|
77472
|
-
"title": "详情",
|
|
77473
|
-
"type": "detail",
|
|
77474
|
-
"children": [
|
|
77475
|
-
{
|
|
77476
|
-
"type": "text",
|
|
77477
|
-
"value": [
|
|
77478
|
-
"创建流数据过滤引擎,返回一个表对象。1.30.17 及 2.00.5 版本开始,DolphinDB 支持通过 :doc:`../r/replay` 函数将多个结构不同的流数据表,回放(序列化)到一个流表里,这个流表被称为异构流表。replay 回放到异构流表的数据严格按照时间顺序排序。``streamFilter`` 函数用于解析(反序列化)和过滤异构流表的数据并进行处理,包含以下两个步骤:",
|
|
78879
|
+
"`msgSchema` 可选字段,字典。",
|
|
78880
|
+
"",
|
|
78881
|
+
"* 若分发异构流表,其结构与 replay 回放到异构流表的数据表结构保持一致。引擎将根据 *msgSchema* 指定的结构对注入的数据解析;",
|
|
78882
|
+
"* 若分发普通流表,该参数必须设置为空。",
|
|
78883
|
+
"",
|
|
78884
|
+
"以下参数仅在分发普通流表时指定:",
|
|
77479
78885
|
"",
|
|
77480
|
-
"
|
|
78886
|
+
"`timeColumn` 字符串,指定为 *dummyTable* 中时间列的名称。若不指定,则取 *dummyTable* 第一列的列名。",
|
|
77481
78887
|
"",
|
|
77482
|
-
"
|
|
78888
|
+
"`conditionColumn` 字符串,指定为 *dummyTable* 中的列名。注意 *conditionColumn* 只能指定 STRING 或 SYMBOL 类型的列。若不指定该参数,则 *filter* 的 *condition* 字段将失效。",
|
|
78889
|
+
""
|
|
77483
78890
|
]
|
|
77484
78891
|
}
|
|
77485
78892
|
]
|
|
@@ -77491,6 +78898,8 @@
|
|
|
77491
78898
|
{
|
|
77492
78899
|
"type": "text",
|
|
77493
78900
|
"value": [
|
|
78901
|
+
"\\(1) 异构流表分发:",
|
|
78902
|
+
"",
|
|
77494
78903
|
"下例对存放在分布式数据库的订单表和交易表进行回放,按照时间顺序序列化到一个流表里。经过排序后的数据通过 ``streamFilter`` 反序列化后,",
|
|
77495
78904
|
"再过滤出订单表和交易表并分发到 asof join 引擎的左、右表里,进行实时双时间连接(两个流表之间的数据会按时间顺序输出)。",
|
|
77496
78905
|
""
|
|
@@ -77570,7 +78979,7 @@
|
|
|
77570
78979
|
" $ filter1['timeRange']=09:30:00.000:09:30:00.005",
|
|
77571
78980
|
"",
|
|
77572
78981
|
" $ filter2=dict(STRING,ANY)",
|
|
77573
|
-
" $ filter2['condition']
|
|
78982
|
+
" $ filter2['condition']=`trades",
|
|
77574
78983
|
" $ filter2['timeRange']=09:30:00.000:09:30:00.005",
|
|
77575
78984
|
"",
|
|
77576
78985
|
" $ ajEngine=createAsofJoinEngine(name=\"ajEngine\", leftTable=streamOrders, rightTable=streamTrades, outputTable=streamOpt, metrics=<[volume,price,price*volume]>, matchingColumn=`sym, useSystemTime=true)",
|
|
@@ -77590,7 +78999,120 @@
|
|
|
77590
78999
|
" //取消订阅",
|
|
77591
79000
|
" unsubscribeTable(tableName=\"opt\", actionName=\"sub1\")",
|
|
77592
79001
|
" dropStreamEngine(`streamFilter)",
|
|
77593
|
-
" dropStreamEngine(`ajEngine)"
|
|
79002
|
+
" dropStreamEngine(`ajEngine)",
|
|
79003
|
+
"",
|
|
79004
|
+
"",
|
|
79005
|
+
"\\(2) 普通流表分发:",
|
|
79006
|
+
"",
|
|
79007
|
+
"下例,将普通流表(trades)数据注入分发引擎中,根据过滤条件进行分发处理。",
|
|
79008
|
+
""
|
|
79009
|
+
]
|
|
79010
|
+
},
|
|
79011
|
+
{
|
|
79012
|
+
"type": "code",
|
|
79013
|
+
"language": "console",
|
|
79014
|
+
"value": [
|
|
79015
|
+
""
|
|
79016
|
+
]
|
|
79017
|
+
},
|
|
79018
|
+
{
|
|
79019
|
+
"type": "text",
|
|
79020
|
+
"value": [
|
|
79021
|
+
" $ n=20",
|
|
79022
|
+
" $ sym = symbol(rand(`A`B`C,n))",
|
|
79023
|
+
" $ name = string(rand(1..10,n))",
|
|
79024
|
+
" $ date = temporalAdd(2012.12.06,0..(n-1),'d')",
|
|
79025
|
+
" $ time = temporalAdd(09:30:00.000,0..(n-1),'ms')",
|
|
79026
|
+
" $ vol = rand(100,n)",
|
|
79027
|
+
" $ t = table(date,time,sym,name,vol)",
|
|
79028
|
+
"",
|
|
79029
|
+
" //定义两个流数据引擎,作为分发引擎 handler",
|
|
79030
|
+
" $ share streamTable(100:0,`date`time`sym`name`vol,[DATE,TIME,SYMBOL,STRING,INT]) as st1",
|
|
79031
|
+
" $ share streamTable(100:0,`date`time`sym`name`vol,[DATE,TIME,SYMBOL,STRING,INT]) as st2",
|
|
79032
|
+
" $ share streamTable(100:0,`date`time`sym`name`vol,[DATE,TIME,SYMBOL,STRING,INT]) as st3",
|
|
79033
|
+
"",
|
|
79034
|
+
" //handler为引擎时的输入流表",
|
|
79035
|
+
" $ share streamTable(100:0,`time`sym`sum_vol,[TIME,SYMBOL,INT]) as output1",
|
|
79036
|
+
" $ share streamTable(100:0,`time`avg_vol,[TIME,INT]) as output2",
|
|
79037
|
+
" $ engine1=createTimeSeriesEngine(name=\"timeEngine\", windowSize=3, step=3, metrics=<[sum(vol)]>, dummyTable=st3, outputTable=output1, timeColumn=`time, useSystemTime=false, keyColumn=`sym, garbageSize=50)",
|
|
79038
|
+
" $ engine2=createReactiveStateEngine(name=\"reactiveEngine\", metrics=<[mavg(vol, 3)]>, dummyTable=st1, outputTable=output2, keyColumn=`sym)",
|
|
79039
|
+
" ",
|
|
79040
|
+
" //需要注入分发引擎的流表",
|
|
79041
|
+
" $ share streamTable(100:0,`date`time`sym`name`vol,[DATE,TIME,SYMBOL,STRING,INT]) as trades",
|
|
79042
|
+
"",
|
|
79043
|
+
" //设置第一个过滤条件,将 trades表 中 sy m列对应元素为 A 且时间在09:30:00.001:09:30:00.010和09:29:00.000:09:30:00.000的数据输入状态引擎进行处理",
|
|
79044
|
+
" $ filter1 = dict(STRING,ANY)",
|
|
79045
|
+
" $ filter1['condition']=`A",
|
|
79046
|
+
" $ filter1['handler']=engine2",
|
|
79047
|
+
" $ filter1['timeRange']=(09:30:00.001:09:30:00.010,09:29:00.000:09:30:00.000)",
|
|
79048
|
+
"",
|
|
79049
|
+
" //设置第二个过滤条件,将 trades 表时间范围在09:30:00.002:09:30:00.005里的数据全部输出到st2表里",
|
|
79050
|
+
" $ filter2 = dict(STRING,ANY)",
|
|
79051
|
+
" $ filter2['handler']=st2",
|
|
79052
|
+
" $ filter2['timeRange']=09:30:00.002:09:30:00.005",
|
|
79053
|
+
"",
|
|
79054
|
+
" //设置第三个过滤条件,将 trades 表中 sym 列对应元素为 A 和 C 的数据输入时序引擎进行处理",
|
|
79055
|
+
" $ filter3 = dict(STRING,ANY)",
|
|
79056
|
+
" $ filter3['condition']=`C`A",
|
|
79057
|
+
" $ filter3['handler']=engine1",
|
|
79058
|
+
"",
|
|
79059
|
+
" //订阅分发引擎,根据以上三个过滤条件,对 trades 表中的数据进行分发处理",
|
|
79060
|
+
" $ streamFilter2=streamFilter(name=\"streamFilterDemo\",dummyTable=trades,filter=[filter1,filter2,filter3], timeColumn=`time, conditionColumn=`sym)",
|
|
79061
|
+
" $ subscribeTable(tableName=\"trades\", actionName=\"sub1\", offset=0, handler=streamFilter2, msgAsTable=true)",
|
|
79062
|
+
" $ trades.append!(t)",
|
|
79063
|
+
""
|
|
79064
|
+
]
|
|
79065
|
+
},
|
|
79066
|
+
{
|
|
79067
|
+
"type": "code",
|
|
79068
|
+
"language": "console",
|
|
79069
|
+
"value": [
|
|
79070
|
+
""
|
|
79071
|
+
]
|
|
79072
|
+
},
|
|
79073
|
+
{
|
|
79074
|
+
"type": "text",
|
|
79075
|
+
"value": [
|
|
79076
|
+
" $ select * from output1",
|
|
79077
|
+
"",
|
|
79078
|
+
"============ ===== ========",
|
|
79079
|
+
"time sym sum_vol",
|
|
79080
|
+
"============ ===== ========",
|
|
79081
|
+
"09:30:00.003 A 64",
|
|
79082
|
+
"09:30:00.003 C 92",
|
|
79083
|
+
"09:30:00.006 A 22",
|
|
79084
|
+
"09:30:00.006 C 5",
|
|
79085
|
+
"09:30:00.009 A 38",
|
|
79086
|
+
"09:30:00.012 A 38",
|
|
79087
|
+
"09:30:00.012 C 113",
|
|
79088
|
+
"09:30:00.015 A 76",
|
|
79089
|
+
"============ ===== ========",
|
|
79090
|
+
""
|
|
79091
|
+
]
|
|
79092
|
+
},
|
|
79093
|
+
{
|
|
79094
|
+
"type": "code",
|
|
79095
|
+
"language": "console",
|
|
79096
|
+
"value": [
|
|
79097
|
+
""
|
|
79098
|
+
]
|
|
79099
|
+
},
|
|
79100
|
+
{
|
|
79101
|
+
"type": "text",
|
|
79102
|
+
"value": [
|
|
79103
|
+
" $ select * from output2",
|
|
79104
|
+
"",
|
|
79105
|
+
"+-------------+--------+",
|
|
79106
|
+
"|time |avg_vol |",
|
|
79107
|
+
"+=============+========+",
|
|
79108
|
+
"|00:00:00.001 | |",
|
|
79109
|
+
"+-------------+--------+",
|
|
79110
|
+
"|00:00:00.001 | |",
|
|
79111
|
+
"+-------------+--------+",
|
|
79112
|
+
"|00:00:00.001 | 41 |",
|
|
79113
|
+
"+-------------+--------+",
|
|
79114
|
+
"|00:00:00.001 | 33 |",
|
|
79115
|
+
"+-------------+--------+"
|
|
77594
79116
|
]
|
|
77595
79117
|
}
|
|
77596
79118
|
]
|
|
@@ -85449,7 +86971,7 @@
|
|
|
85449
86971
|
{
|
|
85450
86972
|
"type": "text",
|
|
85451
86973
|
"value": [
|
|
85452
|
-
"transFreq(X, rule)"
|
|
86974
|
+
"transFreq(X, rule, [closed], [label], [origin='start_day'])"
|
|
85453
86975
|
]
|
|
85454
86976
|
}
|
|
85455
86977
|
]
|
|
@@ -85495,7 +87017,27 @@
|
|
|
85495
87017
|
"\"N\" nanosecond",
|
|
85496
87018
|
"================ =======================",
|
|
85497
87019
|
"",
|
|
85498
|
-
"以上字符串亦可配合数字用于rule参数,例如\"2M\"表示频率为每两个月的月末。"
|
|
87020
|
+
"以上字符串亦可配合数字用于 *rule* 参数,例如\"2M\"表示频率为每两个月的月末。",
|
|
87021
|
+
"",
|
|
87022
|
+
"`closed` 字符串,表示分组区间哪一个边界是闭合的。",
|
|
87023
|
+
"",
|
|
87024
|
+
"* *rule* 为 'M', 'A', 'Q', 'BM', 'BA', 'BQ' 和 'W' 时,*closed* 的默认取值为 'right' ,否则,*closed* 的默认取值为 'left'。",
|
|
87025
|
+
"* *origin* 取 'end' 或者 'end_day' 时,*closed* 的默认值为 'right'。",
|
|
87026
|
+
"* 1.30.18/2.00.6 版本,当 *rule* 的精度为天以上时,不支持使用默认值以外的选项。",
|
|
87027
|
+
"",
|
|
87028
|
+
"`label` 字符串,表示将分组区间的哪一个边界作为 *label* 输出。",
|
|
87029
|
+
"",
|
|
87030
|
+
"* *rule* 为 'M', 'A', 'Q', 'BM', 'BA', 'BQ' 和 'W' 时,*label* 的默认取值为 'right' ,否则,*label* 的默认取值为 'left'。",
|
|
87031
|
+
"* *origin* 取 'end' 或者 'end_day' 时,*label* 的默认值为 'right'。",
|
|
87032
|
+
"* 1.30.18/2.00.6 版本,当 *rule* 的精度为天以上时,不支持使用默认值以外的选项。",
|
|
87033
|
+
"",
|
|
87034
|
+
"`origin` 字符串或和 *X* 具有相同时间类型的标量,表示基于时间戳调整分组。取值为 'epoch', start', 'start_day', 'end', 'end_day' 或自定义的时间对象,默认值为 'start_day'。",
|
|
87035
|
+
"",
|
|
87036
|
+
"* 'epoch':分组起始点为1970-01-01。",
|
|
87037
|
+
"* 'start':分组起始点为时间序列的第一个值。",
|
|
87038
|
+
"* 'start_day':分组起始点是时间序列的第一个值对应日期的午夜零点。",
|
|
87039
|
+
"* 'end':分组起始点是时间序列的最后一个时间戳。",
|
|
87040
|
+
"* 'end_day':分组起始点是时间序列的最后一个时间戳对应日期的午夜24点(即下一日的零点)。"
|
|
85499
87041
|
]
|
|
85500
87042
|
}
|
|
85501
87043
|
]
|
|
@@ -85528,7 +87070,25 @@
|
|
|
85528
87070
|
" [2020.09.30,2020.12.31]",
|
|
85529
87071
|
"",
|
|
85530
87072
|
" $ transFreq(2020.08.08 2020.11.18, \"2Q\");",
|
|
85531
|
-
" [2020.09.30,2021.03.31]"
|
|
87073
|
+
" [2020.09.30,2021.03.31]",
|
|
87074
|
+
""
|
|
87075
|
+
]
|
|
87076
|
+
},
|
|
87077
|
+
{
|
|
87078
|
+
"type": "code",
|
|
87079
|
+
"language": "console",
|
|
87080
|
+
"value": [
|
|
87081
|
+
"",
|
|
87082
|
+
" $ s = temporalAdd(2022.01.01 00:00:00,1..8,`m);",
|
|
87083
|
+
"",
|
|
87084
|
+
" $ s.transFreq(rule=\"3min\");",
|
|
87085
|
+
" [2022.01.01T00:00:00,2022.01.01T00:00:00,2022.01.01T00:03:00,2022.01.01T00:03:00,2022.01.01T00:03:00,2022.01.01T00:06:00,2022.01.01T00:06:00,2022.01.01T00:06:00]",
|
|
87086
|
+
"",
|
|
87087
|
+
" $ s.transFreq(rule=`3min,closed=`right);",
|
|
87088
|
+
" [2022.01.01T00:00:00,2022.01.01T00:00:00,2022.01.01T00:00:00,2022.01.01T00:03:00,2022.01.01T00:03:00,2022.01.01T00:03:00,2022.01.01T00:06:00,2022.01.01T00:06:00]",
|
|
87089
|
+
" ",
|
|
87090
|
+
" $ s.transFreq(rule=`3min,closed=`right,origin=`end);",
|
|
87091
|
+
" [2021.12.31T23:59:00,2021.12.31T23:59:00,2022.01.01T00:02:00,2022.01.01T00:02:00,2022.01.01T00:02:00,2022.01.01T00:05:00,2022.01.01T00:05:00,2022.01.01T00:05:00]"
|
|
85532
87092
|
]
|
|
85533
87093
|
}
|
|
85534
87094
|
]
|
|
@@ -87327,6 +88887,24 @@
|
|
|
87327
88887
|
"title": "例子",
|
|
87328
88888
|
"type": "example",
|
|
87329
88889
|
"children": [
|
|
88890
|
+
{
|
|
88891
|
+
"type": "text",
|
|
88892
|
+
"value": [
|
|
88893
|
+
"在发布节点发布一张表 trades。",
|
|
88894
|
+
""
|
|
88895
|
+
]
|
|
88896
|
+
},
|
|
88897
|
+
{
|
|
88898
|
+
"type": "code",
|
|
88899
|
+
"language": "console",
|
|
88900
|
+
"value": [
|
|
88901
|
+
"",
|
|
88902
|
+
" $ t=streamTable(100:0,`date`time`sym`qty`price`exch,[DATE,TIME,SYMBOL,INT,DOUBLE,SYMBOL])",
|
|
88903
|
+
" $ share t as trades",
|
|
88904
|
+
" $ t=NULL",
|
|
88905
|
+
""
|
|
88906
|
+
]
|
|
88907
|
+
},
|
|
87330
88908
|
{
|
|
87331
88909
|
"type": "text",
|
|
87332
88910
|
"value": [
|
|
@@ -87339,11 +88917,12 @@
|
|
|
87339
88917
|
"language": "console",
|
|
87340
88918
|
"value": [
|
|
87341
88919
|
"",
|
|
87342
|
-
" $ t=streamTable(
|
|
88920
|
+
" $ t=streamTable(100:0,`date`time`sym`qty`price`exch,[DATE,TIME,SYMBOL,INT,DOUBLE,SYMBOL])",
|
|
87343
88921
|
" $ share t as trades2",
|
|
87344
88922
|
" $ t=NULL",
|
|
87345
|
-
" $ h=xdb(\"localhost\",
|
|
87346
|
-
" $ subscribeTable(h
|
|
88923
|
+
" $ h=xdb(\"localhost\",8902)",
|
|
88924
|
+
" $ subscribeTable(server=h, tableName=\"trades\", actionName=\"sub1\", handler=trades2);",
|
|
88925
|
+
" localhost:8902:node1/trades/sub1",
|
|
87347
88926
|
"",
|
|
87348
88927
|
""
|
|
87349
88928
|
]
|