Nifi 从 ExecuteSQL 输出中提取内容
Nifi extract content from ExecuteSQL output
我正在尝试从 Oracle 获取 DDL,然后将 DDL 转换为适合 Vertica 数据库的语法。我的执行 SQL 处理器 SQL 查询是:
select dbms_metadata.get_ddl('TABLE','${table_name}','${owner}') as t_ddl from dual
我得到以下 AVRO 格式的输出:
Objavro.schemaú{"type":"record","name":"NiFi_ExecuteSQL_Record","namespace":"any.data","fields":[{"name":"T_DDL","type":["null","string"]}]}avro.codecnull¶½``¼�÷KGÙ‡LÞoCäÞ
CREATE TABLE "VDBA"."CUSTOMERS"
( "CUSTOMER_ID" NUMBER(10,0) NOT NULL ENABLE,
"CUSTOMER_NAME" VARCHAR2(50) NOT NULL ENABLE,
"CITY" VARCHAR2(50),
"ITEMS_CNT" NUMBER(5,0),
"TSTAMP" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP NOT NULL ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ¶½``¼�÷KGÙ‡LÞoC
从这个输出中,我只需要以下文本:
CREATE TABLE VDBA.CUSTOMERS
(CUSTOMER_ID NUMBER(10,0) NOT NULL,
CUSTOMER_NAME VARCHAR2(50) NOT NULL,
CITY VARCHAR2(50),
ITEMS_CNT NUMBER(5,0),
TSTAMP TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP NOT NULL
)
我无法理解下一步该怎么做。 ReplaceText 处理器会在这里工作吗?请给我一些前进的指示。
感谢和问候,
比沙尔
尝试使用 ConvertAvroToJSON
处理器,然后从那里操纵或提取 JSON。
从 NiFi 1.8.0 开始,您可以使用 ExecuteSQLRecord 而不是 ExecuteSQL,之后就不需要转换处理器了。然后,您可以使用 CSVRecordSetWriter(配置为不输出 header 或引号字符串)或带有文本 ${T_DDL}
的 FreeFormTextRecordSetWriter 来输出包含 DDL 语句的单个字段的内容。
我正在尝试从 Oracle 获取 DDL,然后将 DDL 转换为适合 Vertica 数据库的语法。我的执行 SQL 处理器 SQL 查询是:
select dbms_metadata.get_ddl('TABLE','${table_name}','${owner}') as t_ddl from dual
我得到以下 AVRO 格式的输出:
Objavro.schemaú{"type":"record","name":"NiFi_ExecuteSQL_Record","namespace":"any.data","fields":[{"name":"T_DDL","type":["null","string"]}]}avro.codecnull¶½``¼�÷KGÙ‡LÞoCäÞ
CREATE TABLE "VDBA"."CUSTOMERS"
( "CUSTOMER_ID" NUMBER(10,0) NOT NULL ENABLE,
"CUSTOMER_NAME" VARCHAR2(50) NOT NULL ENABLE,
"CITY" VARCHAR2(50),
"ITEMS_CNT" NUMBER(5,0),
"TSTAMP" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP NOT NULL ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ¶½``¼�÷KGÙ‡LÞoC
从这个输出中,我只需要以下文本:
CREATE TABLE VDBA.CUSTOMERS
(CUSTOMER_ID NUMBER(10,0) NOT NULL,
CUSTOMER_NAME VARCHAR2(50) NOT NULL,
CITY VARCHAR2(50),
ITEMS_CNT NUMBER(5,0),
TSTAMP TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP NOT NULL
)
我无法理解下一步该怎么做。 ReplaceText 处理器会在这里工作吗?请给我一些前进的指示。
感谢和问候, 比沙尔
尝试使用 ConvertAvroToJSON
处理器,然后从那里操纵或提取 JSON。
从 NiFi 1.8.0 开始,您可以使用 ExecuteSQLRecord 而不是 ExecuteSQL,之后就不需要转换处理器了。然后,您可以使用 CSVRecordSetWriter(配置为不输出 header 或引号字符串)或带有文本 ${T_DDL}
的 FreeFormTextRecordSetWriter 来输出包含 DDL 语句的单个字段的内容。