You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@doris.apache.org by 王云飞 <yf...@quant-chi.com> on 2023/01/28 02:37:58 UTC

doris uniq数据模型sequence序列替换失效

您好!我在使用doris的uniq模型时,设置了某一列为sequence_col,但是在使用stream_load的方式导入的时候,同一批次的数据(两条数据相同id,就是sequence列不同)替换顺序逻辑失效,仍然是后者覆盖前者,如果是分成两批次导入,替换顺序逻辑有效。请问应该如何避免?
如图所示,doc_1的public_date大,doc_2的小,但是导入之后,保留了doc_2,如果是分开导入就可以,同一批次导入就不行。

Re: 回复:doris uniq数据模型sequence序列替换失效

Posted by ch...@gmail.com.
你好,该问题目前在Doris Master上已经修复,会随着1.2.2进行发布

Best
Chen Zhang
On 2023年1月28日 +0800 11:07, 王云飞 <yf...@quant-chi.com>, wrote:
> doris版本号:
> <temp4cj.png>
>
> 建表语句:
> create table if not exists `dw_patent_test` (
> id VARCHAR(100)  NOT NULL COMMENT  '专利ID,为主键',
> title VARCHAR(1000)  COMMENT  '标题',
> abstract STRING  COMMENT  '摘要',
> address VARCHAR(1000)  COMMENT  '地址',
> applicants STRING  COMMENT  '申请人',
> inventors STRING  COMMENT  '发明人',
> zip_code VARCHAR(20)  COMMENT  '邮政编码',
> patent_type VARCHAR(50)  COMMENT  '专利类型',
> apply_code VARCHAR(50)  COMMENT  '申请号',
> apply_date DATE COMMENT  '申请日期',
> public_code VARCHAR(50)  COMMENT  '公开号',
> public_date DATE  COMMENT  '公开日期',
> ipc STRING  COMMENT  'IPC分类号',
> cpc STRING  COMMENT  'CPC分类号',
> agency VARCHAR(200)  COMMENT  '代理机构',
> agents VARCHAR(300)  COMMENT  '代理人',
> status VARCHAR(200) COMMENT  '法律状态',
> is_valid TINYINT COMMENT  '是否有效',
> province VARCHAR(50) COMMENT  'address所在省份',
> city VARCHAR(50) COMMENT  'address所在城市',
> area VARCHAR(50) COMMENT  'address所在区县',
> create_time DATETIME COMMENT  '创建时间',
> update_time DATETIME COMMENT  '更新时间'
> )
> ENGINE=OLAP
> unique KEY(`id`)
> DISTRIBUTED BY HASH(`id`) BUCKETS 30
> PROPERTIES (
>     "function_column.sequence_type" = 'Date',
>     "replication_allocation" = "tag.location.default: 1",
>     "in_memory" = "false"
> )
>
>
> 导入数据,使用python脚本,使用DorisClient第三方库:
> # -*- coding: utf-8 -*-
> import hashlib
> import logging
> import os
> import re
> import sys
> from collections import OrderedDict
>
> import pandas as pd
> import requests
>
> from elasticsearch import Elasticsearch
> from DorisClient import DorisSession
> from tqdm import tqdm
>
> # doris配置信息
> DORIS_FE_SERVERS = ['192.168.1.38:8030']
> DORIS_MYSQL_PORT = 9030
> DORIS_USER = 'root'
> DORIS_PASSWD = "123456"
> DORIS_DATABASE = "lz_dw_knowledge_center"
> DORIS_TABLE = "dw_patent_test"
>
>
> def main():
>     """
>     主函数入口
>     """
>
>     ## 连接doris
>     doris_cfg = {
>         'fe_servers': DORIS_FE_SERVERS,
>         'database': DORIS_DATABASE,
>         'user': DORIS_USER,
>         'passwd': DORIS_PASSWD,
>         "mysql_port": DORIS_MYSQL_PORT
>     }
>     doris = DorisSession(**doris_cfg)
>
>     data = []
>
>     doc_1 = {
>         "id": "instance_doc_patent-6245050e88217fde7b630feb9083438c",
>         "title": "一种改良型无纺布",
>         "abstract": "本实用新型公开一种改良型无纺布,属于无纺布技术领域,包括上层无纺布、下层无纺布、胶粘层和透气层,其特征在于:所述透气层位于上层无纺布的上端,所述透气层和上层无纺布、上层无纺布和下层无纺布之间均通过胶粘层连接,所述上层无纺布的上端设有若干向下凹陷的图案一,所述图案一的下端设有粘连区,所述图案一的两侧设有未粘连区,所述粘连区和未粘连区之间设有空腔,所述未粘连区向外凸出,所述未粘连区的内部填充有强韧复合纤维,本实用的无纺布具有弹性强、透气性好等优点。",
>         "public_date": "2018-10-26",
>         "applicants": "浙江东阳市三星实业有限公司",
>         "zip_code": "",
>         "address": "浙江省金华市东阳市六石街道黄雾西路47号"
>     }
>
>     doc_2 = {
>         "id": "instance_doc_patent-6245050e88217fde7b630feb9083438c",
>         "title": "一种改良型无纺布",
>         "abstract": "本实用新型公开一种改良型无纺布,属于无纺布技术领域,包括上层无纺布、下层无纺布、胶粘层和透气层,其特征在于:所述透气层位于上层无纺布的上端,所述透气层和上层无纺布、上层无纺布和下层无纺布之间均通过胶粘层连接,所述上层无纺布的上端设有若干向下凹陷的图案一,所述图案一的下端设有粘连区,所述图案一的两侧设有未粘连区,所述粘连区和未粘连区之间设有空腔,所述未粘连区向外凸出,所述未粘连区的内部填充有强韧复合纤维,本实用的无纺布具有弹性强、透气性好等优点。",
>         "public_date": "2018-10-23",
>         "applicants": "浙江东阳市三星实业有限公司",
>         "zip_code": "32100",
>         "address": "浙江省金华市东阳市六石街道黄雾西路47号"
>     }
>
>
>     dir_sort = OrderedDict(sorted(doc_1.items(), key=lambda t: t[0]))
>     data.append(dir_sort)
>
>     dir_sort = OrderedDict(sorted(doc_2.items(), key=lambda t: t[0]))
>     data.append(dir_sort)
>
>     ## 数据插入
>     if data:
>         success_flag = doris.streamload(table=DORIS_TABLE, json_array=data, sequence_col="public_date")
>         if not success_flag:
>             msg = "数据插入失败,失败原因应插入条数{}, 实际插入条数0".format(str(len(data)))
>             print(msg)
>
>
> if __name__ == '__main__':
>     main()
>
>
>
>
> > ------------------------------------------------------------------
> > 发件人:chzhang1987 <ch...@gmail.com>
> > 发送时间:2023年1月28日(星期六) 10:48
> > 收件人:dev <de...@doris.apache.org>; 王云飞 <yf...@quant-chi.com>
> > 主 题:Re: doris uniq数据模型sequence序列替换失效
> >
> > 您好,在同一批次内部 sequence_col 的替换逻辑应该也是生效的,方便提供一下出现问题的doris 版本号,导入的数据、schema 和导入语句吗?你可以建立一个 issue,将相关信息放在 issue 中,便于跟进,谢谢
> >
> > Best
> > Chen Zhang
> > On 2023年1月28日 +0800 10:38, 王云飞 <yf...@quant-chi.com>, wrote:
> > 您好!我在使用doris的uniq模型时,设置了某一列为sequence_col,但是在使用stream_load的方式导入的时候,同一批次的数据(两条数据相同id,就是sequence列不同)替换顺序逻辑失效,仍然是后者覆盖前者,如果是分成两批次导入,替换顺序逻辑有效。请问应该如何避免?
> > 如图所示,doc_1的public_date大,doc_2的小,但是导入之后,保留了doc_2,如果是分开导入就可以,同一批次导入就不行。
> >
>

回复:doris uniq数据模型sequence序列替换失效

Posted by 王云飞 <yf...@quant-chi.com>.
doris版本号:
建表语句:
create table if not exists `dw_patent_test` (
id VARCHAR(100) NOT NULL COMMENT '专利ID,为主键',
title VARCHAR(1000) COMMENT '标题',
abstract STRING COMMENT '摘要',
address VARCHAR(1000) COMMENT '地址',
applicants STRING COMMENT '申请人',
inventors STRING COMMENT '发明人',
zip_code VARCHAR(20) COMMENT '邮政编码',
patent_type VARCHAR(50) COMMENT '专利类型',
apply_code VARCHAR(50) COMMENT '申请号',
apply_date DATE COMMENT '申请日期',
public_code VARCHAR(50) COMMENT '公开号',
public_date DATE COMMENT '公开日期',
ipc STRING COMMENT 'IPC分类号', 
cpc STRING COMMENT 'CPC分类号',
agency VARCHAR(200) COMMENT '代理机构',
agents VARCHAR(300) COMMENT '代理人',
status VARCHAR(200) COMMENT '法律状态',
is_valid TINYINT COMMENT '是否有效',
province VARCHAR(50) COMMENT 'address所在省份',
city VARCHAR(50) COMMENT 'address所在城市',
area VARCHAR(50) COMMENT 'address所在区县',
create_time DATETIME COMMENT '创建时间',
update_time DATETIME COMMENT '更新时间'
)
ENGINE=OLAP
unique KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 30
PROPERTIES (
"function_column.sequence_type" = 'Date',
"replication_allocation" = "tag.location.default: 1",
"in_memory" = "false"
)
导入数据,使用python脚本,使用DorisClient第三方库:
# -*- coding: utf-8 -*-
import hashlib
import logging
import os
import re
import sys
from collections import OrderedDict
import pandas as pd
import requests
from elasticsearch import Elasticsearch
from DorisClient import DorisSession
from tqdm import tqdm
# doris配置信息
DORIS_FE_SERVERS = ['192.168.1.38:8030']
DORIS_MYSQL_PORT = 9030
DORIS_USER = 'root'
DORIS_PASSWD = "123456"
DORIS_DATABASE = "lz_dw_knowledge_center"
DORIS_TABLE = "dw_patent_test"
def main():
"""
 主函数入口
 """
## 连接doris
doris_cfg = {
'fe_servers': DORIS_FE_SERVERS,
'database': DORIS_DATABASE,
'user': DORIS_USER,
'passwd': DORIS_PASSWD,
"mysql_port": DORIS_MYSQL_PORT
 }
doris = DorisSession(**doris_cfg)
data = []
doc_1 = {
"id": "instance_doc_patent-6245050e88217fde7b630feb9083438c",
"title": "一种改良型无纺布",
"abstract": "本实用新型公开一种改良型无纺布,属于无纺布技术领域,包括上层无纺布、下层无纺布、胶粘层和透气层,其特征在于:所述透气层位于上层无纺布的上端,所述透气层和上层无纺布、上层无纺布和下层无纺布之间均通过胶粘层连接,所述上层无纺布的上端设有若干向下凹陷的图案一,所述图案一的下端设有粘连区,所述图案一的两侧设有未粘连区,所述粘连区和未粘连区之间设有空腔,所述未粘连区向外凸出,所述未粘连区的内部填充有强韧复合纤维,本实用的无纺布具有弹性强、透气性好等优点。",
"public_date": "2018-10-26",
"applicants": "浙江东阳市三星实业有限公司",
"zip_code": "",
"address": "浙江省金华市东阳市六石街道黄雾西路47号"
 }
doc_2 = {
"id": "instance_doc_patent-6245050e88217fde7b630feb9083438c",
"title": "一种改良型无纺布",
"abstract": "本实用新型公开一种改良型无纺布,属于无纺布技术领域,包括上层无纺布、下层无纺布、胶粘层和透气层,其特征在于:所述透气层位于上层无纺布的上端,所述透气层和上层无纺布、上层无纺布和下层无纺布之间均通过胶粘层连接,所述上层无纺布的上端设有若干向下凹陷的图案一,所述图案一的下端设有粘连区,所述图案一的两侧设有未粘连区,所述粘连区和未粘连区之间设有空腔,所述未粘连区向外凸出,所述未粘连区的内部填充有强韧复合纤维,本实用的无纺布具有弹性强、透气性好等优点。",
"public_date": "2018-10-23",
"applicants": "浙江东阳市三星实业有限公司",
"zip_code": "32100",
"address": "浙江省金华市东阳市六石街道黄雾西路47号"
 }
dir_sort = OrderedDict(sorted(doc_1.items(), key=lambda t: t[0]))
data.append(dir_sort)
dir_sort = OrderedDict(sorted(doc_2.items(), key=lambda t: t[0]))
data.append(dir_sort)
## 数据插入
if data:
success_flag = doris.streamload(table=DORIS_TABLE, json_array=data, sequence_col="public_date")
if not success_flag:
msg = "数据插入失败,失败原因应插入条数{}, 实际插入条数0".format(str(len(data)))
print(msg)
if __name__ == '__main__':
main()
------------------------------------------------------------------
发件人:chzhang1987 <ch...@gmail.com>
发送时间:2023年1月28日(星期六) 10:48
收件人:dev <de...@doris.apache.org>; 王云飞 <yf...@quant-chi.com>
主 题:Re: doris uniq数据模型sequence序列替换失效
您好,在同一批次内部 sequence_col 的替换逻辑应该也是生效的,方便提供一下出现问题的doris 版本号,导入的数据、schema 和导入语句吗?你可以建立一个 issue,将相关信息放在 issue 中,便于跟进,谢谢
Best
Chen Zhang
On 2023年1月28日 +0800 10:38, 王云飞 <yf...@quant-chi.com>, wrote:
您好!我在使用doris的uniq模型时,设置了某一列为sequence_col,但是在使用stream_load的方式导入的时候,同一批次的数据(两条数据相同id,就是sequence列不同)替换顺序逻辑失效,仍然是后者覆盖前者,如果是分成两批次导入,替换顺序逻辑有效。请问应该如何避免?
如图所示,doc_1的public_date大,doc_2的小,但是导入之后,保留了doc_2,如果是分开导入就可以,同一批次导入就不行。

Re: doris uniq数据模型sequence序列替换失效

Posted by ch...@gmail.com.
您好,在同一批次内部 sequence_col 的替换逻辑应该也是生效的,方便提供一下出现问题的doris 版本号,导入的数据、schema 和导入语句吗?你可以建立一个 issue,将相关信息放在 issue 中,便于跟进,谢谢

Best
Chen Zhang
On 2023年1月28日 +0800 10:38, 王云飞 <yf...@quant-chi.com>, wrote:
> 您好!我在使用doris的uniq模型时,设置了某一列为sequence_col,但是在使用stream_load的方式导入的时候,同一批次的数据(两条数据相同id,就是sequence列不同)替换顺序逻辑失效,仍然是后者覆盖前者,如果是分成两批次导入,替换顺序逻辑有效。请问应该如何避免?
> > 如图所示,doc_1的public_date大,doc_2的小,但是导入之后,保留了doc_2,如果是分开导入就可以,同一批次导入就不行。
>