管道未使用过程将数据提取到memsql表中

时间:2019-02-06 07:01:58

标签: apache-kafka memsql

我将json(20个键值对)推入kafka并能够使用它-对它进行了测试,以验证是否成功将数据推入kafka。

以下脚本正在创建管道,但未将数据加载到memsql表中。我是否需要修改JSON数据类型的创建管道脚本。

CREATE OR REPLACE PIPELINE omnitracs_gps_evt_pipeline
AS LOAD DATA KAFKA '192.168.188.110:9092/ib_Omnitracs' 
INTO procedure INGEST_OMNITRACS_EVT_PROC;

DELIMITER //
CREATE OR REPLACE PROCEDURE INGEST_OMNITRACS_EVT_PROC(batch query(evt_json json))
AS
BEGIN
    INSERT INTO TEST(id, name) 
      SELECT evt_json::ignition,evt_json::positiontype
      FROM batch;
      ECHO SELECT 'HELLO';
END
//
DELIMITER ; 

TEST PIPELINE omnitracs_gps_evt_pipeline LIMIT 5;
START PIPELINE omnitracs_gps_evt_pipeline FOREGROUND LIMIT 5 BATCHES;

任何人都可以帮忙。

3 个答案:

答案 0 :(得分:1)

您可能应该修改CREATE PIPELINE的AS LOAD DATA子句以执行本机JSON加载,如此处所述:https://docs.memsql.com/sql-reference/v6.7/load-data/#json-load-data

有两个原因:

  • 编写的管道将期望来自kafka的输入位于TSV中 带有1个字段的格式。 TSV是默认格式,它可以推断期望的字段数 从参数到目标存储过程。输入JSON记录实际上很可能会成功解析,但是我不会依赖它。

  • 使用本机JSON管道的subvalue_mapping子句来执行性能更高 提取并插入:: ignition和:: positiontype, 完全跳过存储过程的开销。另外,书面的管道将 实例化临时内存中的JSON数据结构,这相对来说 昂贵。

我建议类似以下内容:

CREATE OR REPLACE PIPELINE omnitracs_gps_evt_pipeline
AS LOAD DATA KAFKA '192.168.188.110:9092/ib_Omnitracs' 
INTO TABLE TEST
FORMAT JSON
( 
  id <- ignition_event,
  name <- position_type
);

答案 1 :(得分:0)

管道的存储过程中不允许使用ECHO SELECT。您应该得到一个错误提示,说的是,当您运行START PIPELINE ... FOREGROUND时,或者如果定义了过程,则在CREATE PIPELINE时运行。

答案 2 :(得分:0)

从kafka的生产者中删除ProducerConfig.TRANSACTIONAL_ID_CONFIG配置后,管道正在运行。

CREATE PIPELINE FEB13_PIPELINE_2
AS LOAD DATA KAFKA '192.168.188.110:9092/FEB13_PROC' 
INTO procedure INGEST_EVT_PROC;

DELIMITER //
CREATE OR REPLACE PROCEDURE INGEST_EVT_PROC(batch query(evt_json json))
AS
BEGIN
    INSERT INTO TEST_FEB13(ID, NAME) 
      SELECT evt_json::ID,evt_json::NAME
      FROM batch;
END
//
DELIMITER ;

现在只需一个小小的疑问,即使在表列中也添加了双引号。如何逃脱。 JSON发送到kafka:“ {'ID':1,'NAME':\'a \'}”