对于Snowflake的REGEXP_SUBSTR与Python连接器感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解pythonsock_raw,并且为您提供关于KafkaConnect+
对于Snowflake 的 REGEXP_SUBSTR 与 Python 连接器感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解python sock_raw,并且为您提供关于Kafka Connect + JDBC Source 连接器 + JDBC Sink 连接器 + MSSQL SQL Server = IDENTITY_INSERT 问题、Oracle REGEXP_SUBSTR | 获取两个定界符之间的字符串、Oracle REGEXP_SUBSTR 到 SUBSTR + INSTR、oracle regexp_substr 报ora-12725 正则表达式中的圆括号不配对的宝贵知识。
本文目录一览:- Snowflake 的 REGEXP_SUBSTR 与 Python 连接器(python sock_raw)
- Kafka Connect + JDBC Source 连接器 + JDBC Sink 连接器 + MSSQL SQL Server = IDENTITY_INSERT 问题
- Oracle REGEXP_SUBSTR | 获取两个定界符之间的字符串
- Oracle REGEXP_SUBSTR 到 SUBSTR + INSTR
- oracle regexp_substr 报ora-12725 正则表达式中的圆括号不配对
Snowflake 的 REGEXP_SUBSTR 与 Python 连接器(python sock_raw)
如何解决Snowflake 的 REGEXP_SUBSTR 与 Python 连接器
我正在使用 Web UI 使用正则表达式构建查询,如下所示:
SELECT uid,REGEXP_SUBSTR(PAGEPAGEPATHLEVEL3,''/(\\\\d+).*'',1,''e'') as listing_id,SUM(TOTALHITS) as hits
FROM ga
WHERE PAGEPAGEPATHLEVEL2 = ''/sales/''
GROUP BY (uid,listing_id)
它完美地工作。但是,一旦我通过 python/pandas 连接传递相同的查询
pd.read_sql_query(query,con=con)
它也有效,但 listing_id
中的所有单元格都是空的!我认为应该对正则表达式中的某些内容进行转义,但找不到任何相关文档
解决方法
您需要对 Python 代码中的反斜杠进行转义。在字符串前添加 r
:
query = r"""
SELECT uid,REGEXP_SUBSTR(PAGEPAGEPATHLEVEL3,''/(\\\\d+).*'',1,''e'') as listing_id,SUM(TOTALHITS) as hits
FROM ga
WHERE PAGEPAGEPATHLEVEL2 = ''/sales/''
GROUP BY (uid,listing_id)
"""
或双反斜杠:
query = """
SELECT uid,''/(\\\\\\\\d+).*'',listing_id)
"""
Kafka Connect + JDBC Source 连接器 + JDBC Sink 连接器 + MSSQL SQL Server = IDENTITY_INSERT 问题
如何解决Kafka Connect + JDBC Source 连接器 + JDBC Sink 连接器 + MSSQL SQL Server = IDENTITY_INSERT 问题
我试图弄清楚为什么我在尝试使用 JDBC 接收器连接器将数据从主题接收到 sql Server 数据库时收到“IDENTITY_INSERT”错误,该主题也由连接到的 JDBC 源连接器写入相同的 sql Server 数据库。
总体目标:
目前有一个 sql Server 数据库被后端用于传统意义上的存储,我们正在尝试过渡到使用 Kafka 来实现所有相同的目的,但是 sql Server 数据库暂时必须保留为有些服务仍然依赖它,我们要求将 Kafka 上的所有数据镜像到 sql Server 数据库中。
我正在努力实现的目标:
我正在尝试创建一个设置,其中包含以下内容:
- 一个 sql Server 数据库(所有具有相同主键“id”的表,该主键自动递增并由 sql Server 设置)
- Kafka 集群,包括 Kafka 连接:
- 用于将 sql Server 表中的内容同步到 kafka 主题的 JDBC 源连接器,对于主题和表,我们将其称为 AccountType
- 订阅相同主题的 JD Sink 连接器 AccountType 并将数据接收到 sql Server 数据库中相同的 AccountType 表
预期行为是:
- 如果旧服务在 sql Server 中写入/更新记录
- 源连接器将获取更改并将其写入相应的 Kafka 主题
- 接收器连接器将收到关于同一主题的消息,但是,由于更改源自 sql Server,因此已经从接收器连接器的角度进行了更改,接收器连接器将在主键上找到匹配项,请参阅没有改变,继续前进
- 如果设计用于与 Kafka 一起使用的新服务更新记录并将其写入正确的主题:
- JDBC sink 连接器将接收关于主题的消息作为偏移量
- 由于 sink 连接器配置了 upsert 模式,它会在目标数据库中找到主键的匹配项并更新目标数据库中的相应记录
- 然后源连接器将检测到更改,触发其将更改写入相应的主题
- 此时我的假设是以下两种情况之一会发生:
- 源连接器不会写入主题,因为它只会复制最后一条消息或
- 源连接器会将重复的消息写入主题,但是它会被接收器忽略,因为不会导致数据库记录更改
这种预期行为与我在文档中找到的所有内容一致,并且尽我所能,根据此处找到的 JDBC sink 深度潜水指南:https://rmoff.net/2021/03/12/kafka-connect-jdbc-sink-deep-dive-working-with-primary-keys/[kafka-connect-jdbc-sink-deep-dive-working-with-primary-keys][1]
正在发生的事情:
- Kafka 集群全部启动,数据库为空,两个连接器都创建成功
- 使用外部服务将一行插入到数据库的表中
- 源连接器成功获取更改并将记录写入 Kafka 上的主题(该主题已被转换拆分,因此表示 sql Server 表 PK 的字段已被提取并设置为消息键,并删除从值)
- (问题)接收器连接器然后收到有关该主题的消息,然后...
...这是问题,根据我能找到的几个视频和示例,应该不会发生任何事情,因为该记录在数据库中已经是最新的,但是,它会立即尝试按原样编写整个消息,到目标表,结果如下:
java.sql.BatchUpdateException:当 IDENTITY_INSERT 设置为 OFF 时,无法为表“AccountType”中的标识列插入显式值。
这是有道理的,因为来自主题的消息中有一个主键字段,如果它没有在表中启用,那么它就不应该被允许。只是为了好玩,我尝试在尝试写入之前进行额外的转换以删除 id 字段,而是使用表中的另一个字段,该字段在配置中具有“唯一”约束。当我这次重复这些步骤时,它没有抱怨写入主键,但它仍然立即尝试插入导致另一个错误的记录,因为它会违反唯一约束,这又是完全合理的。
我被困的地方:
如果以上所有内容都有意义,谁能告诉我为什么尽管设置为 upsert,它仍会自动尝试插入?
注意事项:
- 所有这些都是使用 confluent 为 confluent 平台版本 6.2.0 提供的 docker 容器设置的
源连接器配置:
{
"connection.url": "jdbc:sqlserver://mssql:1433;databaseName=REDACTED","connection.user":"REDACTED","connection.password":"REDACTED","connection.attempts": "3","connection.backoff.ms": "5000","table.whitelist": "AccountType","db.timezone": "UTC","name": "sql-server-source","connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector","dialect.name": "sqlServerDatabaseDialect","config.action.reload": "restart","topic.creation.enable": "false","tasks.max": "1","mode": "timestamp+incrementing","incrementing.column.name": "id","timestamp.column.name": "created,updated","validate.non.null": true,"key.converter": "org.apache.kafka.connect.converters.LongConverter","value.converter": "io.confluent.connect.json.JsonSchemaConverter","value.converter.schema.registry.url": "http://schema-registry:8081","auto.register.schemas": "true","schema.registry.url": "http://schema-registry:8081","errors.log.include.messages": "true","transforms": "copyFieldToKey,extractKeyFromStruct,removeKeyFromValue","transforms.copyFieldToKey.type": "org.apache.kafka.connect.transforms.ValuetoKey","transforms.copyFieldToKey.fields": "id","transforms.extractKeyFromStruct.type":
"org.apache.kafka.connect.transforms.ExtractField$Key","transforms.extractKeyFromStruct.field": "id","transforms.removeKeyFromValue.type":
"org.apache.kafka.connect.transforms.ReplaceField$Value","transforms.removeKeyFromValue.blacklist": "id","transforms.extractKeyFromStruct.type":
"org.apache.kafka.connect.transforms.ExtractField$Key",}
接收器连接器配置:
{
"connection.url": "jdbc:sqlserver://mssql:1433;databaseName=REDACTED","table.name.format": "${topic}","name": "sql-server-sink","connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector","auto.create": "false","auto.evolve": "false","batch.size": "1000","topics": "AccountType","insert.mode": "UPSERT","pk.mode": "record_key","pk.fields": "id",}
Oracle REGEXP_SUBSTR | 获取两个定界符之间的字符串
我有绳子Organization, INC..Truck/Equipment Failure |C
。我想在组织名称之后(在两个“
..”字符之后)和管道字符之前获取子字符串。因此,输出字符串应为- Truck/Equipment Failure
。你能帮忙吗?
我一直在尝试形成这样的正则表达式,但似乎没有用。
select regexp_substr(''Organization, INC..Truck/Equipment Failure |C'',''[^.]+'',1,2) from dual;
答案1
小编典典您可以使用它。
SELECT REGEXP_SUBSTR (''Organization, INC..Truck/Equipment Failure |C'', ''([^.]+)\|'', 1, 1, NULL, 1) FROM DUAL;
编辑: 这将恰好匹配两个点,后跟一个或多个字符,|
直到字符串末尾为止。
SELECT REGEXP_SUBSTR (''Organization, INC..Truck/Equipment Failure'', ''\.{2}([^|]+)'', 1, 1, NULL, 1) FROM DUAL;
Oracle REGEXP_SUBSTR 到 SUBSTR + INSTR
如何解决Oracle REGEXP_SUBSTR 到 SUBSTR + INSTR
我正在尝试从 oracle 转换以下代码:
SELECT disTINCT REPLACE(SUBSTR (REGEXP_SUBSTR (code,''[^,]+'',1,LEVEL),2,8),'']'','''') code
FROM DUAL
CONNECT BY REGEXP_SUBSTR (code,LEVEL) IS NOT NULL;
请协助将其转换为一些SUBSTR / INSTR组合或CASE函数。
谢谢。
问候,
解决方法
您的代码不起作用,因为 DUAL
表没有 code
列;但是,如果我们假设您使用的是包含该列的不同表:
CREATE TABLE table_name ( code ) AS
SELECT ''[1],[22],[333],[4444],[55555],[666666],[7777777],[88888888],[999999999],[0000000000]'' FROM DUAL
然后可以使用递归子查询分解子句:
WITH rsqfc ( code,start_pos,end_pos ) AS (
SELECT code,1,INSTR( code,'',1 )
FROM table_name
UNION ALL
SELECT code,end_pos + 1,end_pos + 1 )
FROM rsqfc
WHERE end_pos > 0
)
SELECT DISTINCT
REPLACE(
CASE end_pos
WHEN 0
THEN SUBSTR( code,start_pos + 1,8 )
ELSE SUBSTR( code,LEAST( end_pos - start_pos - 1,8 ) )
END,'']''
) AS code
FROM rsqfc;
输出:
| CODE | | :------- | | 99999999 | | 4444 | | 55555 | | 1 | | 333 | | 22 | | 666666 | | 88888888 | | 00000000 | | 7777777 |
dbfiddle here
oracle regexp_substr 报ora-12725 正则表达式中的圆括号不配对
最近执行以下sql时,报“ora-12725 正则表达式中的圆括号不配对”错
select * from T_S_BBD_WORLDPORT t
where length(regexp_substr('111爱尔兰111',t.itemname)) >0 ';
怀疑是正则表达式关键字括号导致,于是执行
select 1 from dual t
where length(regexp_substr('111福克兰群岛(马尔维纳斯)111','福克兰群岛(马尔维纳斯)')) >0 ;
发现不报错也没有结果,但是执行
select 1 from dual t
where length(regexp_substr('111福克兰群岛(马尔维纳斯)111','福克兰群岛(马尔维纳斯)')) >0 ;
会报错。
换成标准写法
select 1 from dual t
where length(regexp_substr('111福克兰群岛(马尔维纳斯)111','福克兰群岛\(马尔维纳斯\)')) >0 ;
有返回结果。
结论:regexp_substr无法代替like '%string%'
select 1 from dual t where '111福克兰群岛(马尔维纳斯)111' like '%福克兰群岛(马尔维纳斯)%' ;
我们今天的关于Snowflake 的 REGEXP_SUBSTR 与 Python 连接器和python sock_raw的分享已经告一段落,感谢您的关注,如果您想了解更多关于Kafka Connect + JDBC Source 连接器 + JDBC Sink 连接器 + MSSQL SQL Server = IDENTITY_INSERT 问题、Oracle REGEXP_SUBSTR | 获取两个定界符之间的字符串、Oracle REGEXP_SUBSTR 到 SUBSTR + INSTR、oracle regexp_substr 报ora-12725 正则表达式中的圆括号不配对的相关信息,请在本站查询。
本文标签: