Lindorm泛时序数据一站式分析与洞察

方案总览

方案概述

泛时序数据广泛应用于车联网、工业物联网、金融交易、股票分析等多个业务场景。随着业务规模的增长,数据量急剧增加,如何高效获取和分析这些数据成为业务洞察和决策的关键挑战。以车联网场景为例,传统的数据处理通常涉及多个数据组件的整合,运维难度高、数据存储及开发成本高。Lindorm作为阿里云自研的云原生多模数据库,不仅具备低成本存储、弹性高可用的特点,还集数据存储和分析功能于一体,支持存储车辆行驶轨迹、车辆状态、精准定位等车联网关键数据,并提供实时或批量数据处理能力。

Lindorm实现了托管的Hadoop平台功能,提供了包括Flink、HDFS、HBase、Hive、Spark、Trino等组件的能力,可替代自建Hadoop构建的大数据平台实现降本增效。

本方案以车辆网场景为例,引导您使用云原生多模数据库 Lindorm的多种引擎,实现泛时序数据的高并发实时查询和写入,帮助您高效构建车机数据上报、物流轨迹跟踪、实时定位调度等场景服务。

方案架构

解决方案完整版本

方案优势

  • 一体化:一体化操作,开发效率高,多种数据一个入口,统一SQL操作。相比于传统的多个产品支撑一个场景的方案,架构更加简单,易于开发。

  • 低成本:低成本存储,支持PB级存储,支持自适应压缩和表级别的冷热分离,您可以根据数据处理需求自由选择行存储或列存储,最多可节省约50%的成本

  • 高性能:高并发读写,支持千万级并发和毫秒级延迟,可满足车联网大规模数据的在线存储与查询需求。丰富的检索能力,通过宽表引擎和搜索引擎组合,使用SQL一键在所需数据列上建立搜索(倒排)索引,提供在线搜索服务。搜索引擎支持多维检索、全文检索、地理位置检索等多种高级检索能力。

  • 弹性:云原生弹性,灵活扩展,计算引擎具备Serverless特性,可根据集群负载或业务周期性设置弹性策略,按需分配计算规模和资源,工作时集群计算、存储节点自动增加或减少,进行高效交互式分析批处理

部署流程

image

适用场景

  • 车联网:使用Lindorm存储车联网中的行驶轨迹、车辆状况、精准定位等重要数据,提供低成本、弹性、灵活可靠的能力,帮助您构建高效的网约车、物流运输、新能源车检测等场景服务;集成Ganos时空数据库引擎,高效支撑车联网轨迹数据时空分析与挖掘等相关应用场景。

  • 物联网:使用Lindorm存储来自工业物联网场景下的海量异构IT&OT数据,将数据进行同构、汇聚、融合,打破工业场景IT数据和OT数据割裂的“信息孤岛”;通过Lindorm计算引擎提供的低成本、高性能、稳定可靠的分布式计算能力,满足您在数智化生产、交互式数据探索分析、AI/ML数据处理和大规模图计算等场景中的计算需求。

  • 交易账单:使用Lindorm存储金融交易中的海量订单记录,金融风控中的用户事件、画像特征、规则模型、设备指纹等重要数据,提供低成本、高并发、灵活可靠的能力,帮助您构建高效的金融交易与风控服务。

部署准备

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

费用说明

完成本方案的部署及体验,预计产生费用不超过30元。该费用仅为购买本方案示例的资源规格,且使用时长不超过1小时的预估费用。如果您调整了资源规格,或执行了本方案以外的其他操作,可能会导致费用有所变化。请以控制台显示的实际价格和最终账单为准。

本方案以华东1(杭州)地域为例,以下为本方案涉及资源的华东1(杭州)地域单价,仅供参考。

产品

计费项

规格配置

预估费用参考

云原生多模数据库 Lindorm

宽表节点规格

规格:416 GB

宽表节点数量:2

2.500元/小时

搜索节点规格

规格:416 GB

搜索节点数量:2

2.500元/小时

LTS节点规格

规格:48 GB

LTS节点数量:1

1.053元/小时

弹性计算资源

不涉及

2.436

存储空间

160 GB

0.157元/小时

集群固定费用

不涉及

1.875元/小时

云服务器ECS

实例

规格:ecs.e-c1m4.2xlarge

1.35元/小时

系统盘

存储空间:40 GiB(ESSD Entry)

0.02916元/时

专有网络VPC

免费

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值。本方案默认采用按量付费的方式创建资源,请确保账户余额大于等于100元。

  3. 创建用于方案部署的RAM用户。

    1. 创建1RAM用户。具体操作,请参见创建RAM用户

    2. RAM用户授予以下云服务的访问权限以完成方案部署。具体操作,请参见RAM用户授权

      云服务

      需要的权限

      描述

      云原生多模数据库 Lindorm

      AliyunLindormFullAccess

      管理云原生多模数据库 Lindorm的权限。

      云服务器ECS

      AliyunECSFullAccess

      管理云服务器服务ECS的权限。

      专有网络VPC

      AliyunVPCFullAccess

      管理专有网络VPC的权限。

部署资源

1. 创建专有网络VPC和交换机

  1. 登录专有网络管理控制台,创建1个专有网络和1台交换机。

  2. 填写相关配置,具体说明如下:

    项目

    说明

    示例值

    专有网络

    地域

    选择专有网络VPC所在地域,请选择华东1(杭州)地域。

    华东1(杭州)

    名称

    专有网络VPC的名称。命名规则:长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和短划线(-)。

    vpc_lindormk3uu

    IPv4网段

    在创建VPC时,您必须按照无类域间路由块(CIDR block)的格式为您的专有网络划分私网网段。阿里云VPC支持的网段信息请参见专有网络组成部分

    在网络规划时可以按照管理网段-开发网段-测试网段-生产网段等规则做好规划。网段一旦投入使用,调整过程复杂,因此规划十分重要。

    192.168.0.0/16

    交换机

    名称

    虚拟交换机名称。命名规则:长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和短划线(-)。

    vsw_lindomk3uu

    可用区

    在规划的地域内选择1个可用区。

    说明

    请确保交换机所属的可用区的ECSLindorm等资源处于可用状态。

    可用区 G

2.创建云服务器ECS

  1. 登录ECS实例创建页

  2. 按以下规划配置ECS相关配置项。

    配置项

    说明

    付费类型

    选择按量付费

    地域

    选择华东1(杭州)

    网络及可用区

    选择之前规划的专有网络VPC和专有网络交换机。

    实例

    选择规格ecs.e-c1m4.2xlarge(8 vCPU 32 GiB)。

    镜像

    选择CentOS 7.7 64

    系统盘

    选择ESSD Entry类型,容量配置为40 GiB

    公网 IP

    勾选分配公网 IPv4 地址

    安全组

    选择已有安全组或根据页面提示创建新的安全组。安全组规则说明请参见安全组规则

    登录凭证

    选择自定义密码,方便后续登录机器安装服务环境。

  3. 勾选服务协议,单击确认下单

3.创建云原生多模数据库Lindorm

  1. 登录Lindorm实例创建页

  2. 在购买页面,按以下规划配置Lindorm相关配置项。

    1、商品属性及网络配置

    image

    选项

    说明

    商品类型、付费方式、部署方案(分别对应图示①、②、③)

    请按照图中选项配置。

    地域(对应图示④)

    选择华东1(杭州)

    网络相关(对应图示⑤)

    选择之前规划的VPC、交换机及交换区所在可用区。

    2、数据引擎配置

    请按照下图所示进行配置。

    fde3892f2c53a7fa622e56e9d43510ff

  3. 单击立即购买跳转至订单页,勾选服务协议并单击立即开通

配置资源

配置ECS

请根据以下步骤在ECS实例上部署相关开发环境和Lindorm客户端。

步骤一:部署开发环境

本方案将使用Python脚本文件模拟生成车机原始数据,因此您需要在ECS实例上部署Python环境。

  1. 登录ECS实例。

    登录云服务器ECS管理控制台,在目标实例的操作列单击远程连接,使用root权限通过Workbench远程登录。image

  2. 执行以下命令,安装Python环境。

    # 安装Python
    yum install python3 -y
    
    # 安装Python运行时依赖的库
    pip3 install cryptography==3.4.8
  3. 环境验证。

    # 验证Python环境是否安装成功
    python3 --version

步骤二:安装Lindorm客户端

Lindorm-cliLindorm提供的简易命令行工具,在本方案中分别用于连接Lindorm宽表引擎。

  1. 下载客户端安装包Lindorm-cli(Linux操作系统安装包)。下载地址,请参见安装Lindorm-cli

  2. 解压安装包。

    # 解压Lindorm-cli安装包
    tar zxvf lindorm-cli-linux-latest.tar.gz

配置Lindorm

  1. 登录Lindorm管理控制台(杭州地域),单击目标实例ID,进入实例详情页。

  2. 设置Lindorm白名单,将ECS实例的主私网IP添加至组内白名单,保证ECSLindorm之间的连通性。image

    说明

    如何查看ECS实例的主私网IP地址,请参见查看IP地址

  3. 开通搜索索引。搜索索引是宽表引擎与搜索引擎深度融合的特性,更适合复杂的多维查询场景。

    imageLTS规格请按照下表进行配置:

    配置项

    说明

    LTS数据同步Core规格

    选择48 GB

    LTS节点数量

    配置为1个。

  4. 开通列存索引。

    image

  5. 开通OLAP资源组,并将该资源组设置为默认资源组

数据导入

在实际的业务场景中,车机上传的字段有上百甚至上千种,本部署方案筛选了其中一部分作为测试数据:

单击展开字段说明

字段名

类型

备注

vin

STRING

车辆识别号(Vehicle Identification Number),是每一辆车的唯一标识。

sampletime

BIGINT

数据采样的时间点,通常为一个时间戳,表示数据记录的具体时刻。

DriverStateLinkStatus

INT

驾驶员状态监控设备的连接状态。0表示已连接,1表示已断开。

AirBagSystemStatus

INT

安全气囊系统状态。0表示关闭,1表示开启。

HODHandoffmonitorValid

INT

手部脱离方向盘监测系统的合法性状态。0表示合法,1表示非法。

BodyCtrlModRollCounter

INT

车身控制模块的滚动计数器。

VehicleSpeed_kmph

INT

车辆当前行驶速度,单位为千米/小时(km/h)。

SteeringAngle_Deg

DOUBLE

方向盘当前的角度,单位为度(°)。

BatterySOC_Percent

DOUBLE

电池剩余电量,以百分比表示,即电池的SOC(State of Charge)。

BrakePedalStatus

INT

制动踏板的状态,表示是否有制动操作。0表示不制动,1制动。

RegenBrakingLevel

INT

能量回收制动的级别,表示再生制动的强度。

AcceleratorPedalPos_Percent

DOUBLE

加速踏板的位置,以百分比表示。

CoolantTemperature_C

INT

冷却液温度,单位为摄氏度(­°C)。

AEB_Activation

INT

自动紧急制动的激活状态,表示是否触发了AEB功能。 0表示未启动,1表示已启动。

LaneAssistanceStatus

INT

车道保持辅助系统的状态,表示该功能是否有效。0表示无效,1表示有效。

CruiseControlSpeedSet_kmph

INT

设定的巡航控制速度,单位为千米/小时(km/h)。

ParkingAssistEngaged

INT

泊车辅助系统激活状态,表示是否启用了自动泊车功能。0表示无效,1表示有效。

RainSensorStatus

INT

雨量传感器状态,表示是否检测到雨水。0表示未检测到,1表示检测到了雨水。

TirePressure_FL_psi

DOUBLE

前左轮胎压力,单位为磅每平方英寸(psi)。

TirePressure_FR_psi

DOUBLE

前右轮胎压力,单位为磅每平方英寸(psi)。

TirePressure_RL_psi

DOUBLE

后左轮胎压力,单位为磅每平方英寸(psi)。

TirePressure_RR_psi

DOUBLE

后右轮胎压力,单位为磅每平方英寸(psi)。

LaneDepartureWarningActive

INT

车道偏离警告系统激活状态,表示系统是否在监控和警告驾驶员关于无意识的车道变换。0表示关闭,1表示激活 。

BatteryStateOfHealth_Percent

DOUBLE

电池的健康状态。即当前电池相对于全新电池的容量百分比,该数值越接近100%,表示电池越健康。

BatteryTemperature_Avg_C

INT

电池组中所有电池单元的平均温度,单位为摄氏度(­°C)。温度监控对电池的管理和寿命至关重要。

BatteryMaxCellVoltage_V

DOUBLE

电池组中单个电池单元的最大电压,单位为伏特(V)。高电压可能表明电池充电状态良好或单体电压不均。

BatteryMinCellVoltage_V

DOUBLE

电池组中单个电池单元的最小电压,单位为伏特(V)。低电压可能表明电池放电状态过深或出现电池老化。

EvBatteryTemperature_C

DOUBLE

电动车电池的温度,单位为摄氏度(­°C)。

1.创建Lindorm宽表

  1. 登录云服务器ECS管理控制台,在目标实例的操作列单击远程连接,使用root权限通过Workbench远程登录。image

  2. 跳转至Lindorm-cli.exe所在目录,连接Lindorm宽表引擎。

    ./lindorm-cli -url <jdbc url> -username <username> -password <password>

    参数说明

    参数

    获取方法

    jdbc url

    宽表引擎的Lindorm宽表SQL地址。获取方法请参见访问实例

    username

    连接宽表引擎的默认用户名和默认初始密码。获取方式请参见访问实例

    password

  3. 创建表dwd_vehicle_tbox,用于存储车机数据。

    CREATE TABLE dwd_vehicle_tbox (
      `vin` VARCHAR,
      `sampletime` bigint,
      `DriverStateLinkStatus` INT,
      `AirBagSystemStatus` INT,
      `HODHandoffmonitorValid` INT,
      `BodyCtrlModRollCounter` INT,
      `VehicleSpeed_kmph` INT,
      `SteeringAngle_Deg` DOUBLE,
      `BatterySOC_Percent` DOUBLE,
      `BrakePedalStatus` INT,
      `AcceleratorPedalPos_Percent` DOUBLE,
      `RegenBrakingLevel` INT,
      `CoolantTemperature_C` INT,
      `AEB_Activation` INT,
      `LaneAssistanceStatus` INT,
      `CruiseControlSpeedSet_kmph` INT,
      `ParkingAssistEngaged` INT,
      `RainSensorStatus` INT,
      `TirePressure_FL_psi` DOUBLE,
      `TirePressure_FR_psi` DOUBLE,
      `TirePressure_RL_psi` DOUBLE,
      `TirePressure_RR_psi` DOUBLE,
      `LaneDepartureWarningActive` INT,
      `BatteryStateOfHealth_Percent` DOUBLE,
      `BatteryTemperature_Avg_C` INT,
      `BatteryMaxCellVoltage_V` DOUBLE,
      `BatteryMinCellVoltage_V` DOUBLE,
      `EvBatteryTemperature_C` DOUBLE,
       PRIMARY KEY (vin,sampletime)
      );
  4. 可选)验证表dwd_vehicle_tbox结构是否正确。

    DESCRIBE TABLE dwd_vehicle_tbox;

    返回结果:

    单击展开返回结果

    +--------------+------------------+------------------------------+---------+----------------+------------+-------------------+-----------------+
    | TABLE_SCHEMA |    TABLE_NAME    |         COLUMN_NAME          |  TYPE   | IS_PRIMARY_KEY | SORT_ORDER | IS_AUTO_INCREMENT | IS_LOCAL_UNIQUE |
    +--------------+------------------+------------------------------+---------+----------------+------------+-------------------+-----------------+
    | default      | dwd_vehicle_tbox | vin                          | VARCHAR | true           | ASC        | false             | false           |
    | default      | dwd_vehicle_tbox | sampletime                   | BIGINT  | true           | ASC        | false             | false           |
    | default      | dwd_vehicle_tbox | DriverStateLinkStatus        | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | AirBagSystemStatus           | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | HODHandoffmonitorValid       | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | BodyCtrlModRollCounter       | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | VehicleSpeed_kmph            | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | SteeringAngle_Deg            | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | BatterySOC_Percent           | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | BrakePedalStatus             | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | AcceleratorPedalPos_Percent  | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | RegenBrakingLevel            | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | CoolantTemperature_C         | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | AEB_Activation               | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | LaneAssistanceStatus         | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | CruiseControlSpeedSet_kmph   | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | ParkingAssistEngaged         | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | RainSensorStatus             | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | TirePressure_FL_psi          | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | TirePressure_FR_psi          | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | TirePressure_RL_psi          | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | TirePressure_RR_psi          | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | LaneDepartureWarningActive   | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | BatteryStateOfHealth_Percent | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | BatteryTemperature_Avg_C     | INT     | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | BatteryMaxCellVoltage_V      | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | BatteryMinCellVoltage_V      | DOUBLE  | false          | none       | false             | false           |
    | default      | dwd_vehicle_tbox | EvBatteryTemperature_C       | DOUBLE  | false          | none       | false             | false           |
    +--------------+------------------+------------------------------+---------+----------------+------------+-------------------+-----------------+

2.导入数据

  1. 使用组合键Ctrl+D断开宽表引擎的连接,执行以下命令安装Python依赖。

    python3 -m pip install pymysql
  2. 创建Python脚本文件demo.py,执行以下命令编辑文件。

    vim demo.py
  3. 编写完整代码,使用Python脚本模拟生成车机原始数据导入宽表dwd_vehicle_tbox

    # -*- coding: UTF-8 -*-
    import random
    import datetime
    import pymysql
    
    
    def random_string(length=32):
        return ''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', k=length))
    
    
    def random_int(min_val, max_val):
        return random.randint(min_val, max_val)
    
    
    def random_double(min_val, max_val):
        return random.uniform(min_val, max_val)
    
    
    def generate_vehicle_tbox_row(vin=None, current_time=None):
        """给定一个 VIN 和当前时间,生成一行车辆 T-Box 数据。"""
        vehicle_tbox_row_dict = {
            "vin": vin,
            "sampletime": (current_time - random.randint(0, 365 * 24 * 60 * 60 * 1000)),
            "DriverStateLinkStatus": random_int(0, 1),
            "AirBagSystemStatus": random_int(0, 1),
            "HODHandoffmonitorValid": random_int(0, 1),
            "BodyCtrlModRollCounter": random_int(8, 60),
            "VehicleSpeed_kmph": random_int(0, 300),
            "SteeringAngle_Deg": random_double(-720, 720),
            "BatterySOC_Percent": random_double(0, 100),
            "BrakePedalStatus": random_int(0, 1),
            "AcceleratorPedalPos_Percent": random_double(0, 100),
            "RegenBrakingLevel": random_int(0, 5),
            "CoolantTemperature_C": random_int(0, 100),
            "AEB_Activation": random_int(0, 1),
            "LaneAssistanceStatus": random_int(0, 1),
            "CruiseControlSpeedSet_kmph": random_int(0, 300),
            "ParkingAssistEngaged": random_int(0, 1),
            "RainSensorStatus": random_int(0, 1),
            "TirePressure_FL_psi": random_double(0, 3),
            "TirePressure_FR_psi": random_double(0, 3),
            "TirePressure_RL_psi": random_double(0, 3),
            "TirePressure_RR_psi": random_double(0, 3),
            "LaneDepartureWarningActive": random_int(0, 1),
            "BatteryStateOfHealth_Percent": random_double(0, 100),
            "BatteryTemperature_Avg_C": random_int(10, 70),
            "BatteryMaxCellVoltage_V": random_double(3, 8),
            "BatteryMinCellVoltage_V": random_double(3, 8),
            "EvBatteryTemperature_C": random_double(10, 70)
        }
        return vehicle_tbox_row_dict
    
    
    def create_mysql_connection(config):
        try:
            conn = pymysql.connect(
                host=config['host'],
                user=config['user'],
                password=config['password'],
                db=config['database'],
                port=config['port'],
                charset=config['charset'],
                cursorclass=pymysql.cursors.DictCursor
            )
            return conn
        except pymysql.Error as err:  # 修改3:异常类型
            print(f"Database connection failed: {err}")
            raise
    
    
    def insert_batch_data(conn, data_batch):
        """批量插入数据到 MySQL"""
        insert_sql = """
                     INSERT INTO dwd_vehicle_tbox (vin, sampletime, DriverStateLinkStatus, AirBagSystemStatus, \
                                                    HODHandoffmonitorValid, BodyCtrlModRollCounter, VehicleSpeed_kmph, \
                                                    SteeringAngle_Deg, BatterySOC_Percent, BrakePedalStatus, \
                                                    AcceleratorPedalPos_Percent, RegenBrakingLevel, CoolantTemperature_C, \
                                                    AEB_Activation, LaneAssistanceStatus, CruiseControlSpeedSet_kmph, \
                                                    ParkingAssistEngaged, RainSensorStatus, TirePressure_FL_psi, \
                                                    TirePressure_FR_psi, TirePressure_RL_psi, TirePressure_RR_psi, \
                                                    LaneDepartureWarningActive, BatteryStateOfHealth_Percent, \
                                                    BatteryTemperature_Avg_C, BatteryMaxCellVoltage_V, \
                                                    BatteryMinCellVoltage_V, EvBatteryTemperature_C) \
                     VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, \
                             %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, \
                             %s, %s, %s, %s, %s, %s, %s, %s) \
                     """
        try:
            with conn.cursor() as cursor:
                # 转换时间戳格式
                formatted_batch = []
                for row in data_batch:
                    formatted_row = list(row.values())
                    formatted_batch.append(formatted_row)
    
                cursor.executemany(insert_sql, formatted_batch)
                conn.commit()
                return cursor.rowcount
        except pymysql.Error as err:
            conn.rollback()
            print(f"Insert failed: {err}")
            raise
    
    
    if __name__ == "__main__":
        count = 200000  # 总记录数
        vin_count = 10  # 车辆数量
        batch_size = 10000  # 批量插入大小
    
        # 配置参数(添加字符集配置)
        config = {
            'user': 'r***',
            'password': 't***',
            'host': 'ld-bp16f0488y7n****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com',
            'port': 33060,
            'database': 'default',
            'charset': 'utf8mb4'
        }
    
        conn = create_mysql_connection(config)
        vins = [random_string() for _ in range(vin_count)]
        insert_vins = set()
        data_batch = []
        start_time = datetime.datetime.now().timestamp()
    
        try:
            for _ in range(count):
                vin = random.choice(vins)
                insert_vins.add(vin)
                row_data = generate_vehicle_tbox_row(vin, datetime.datetime.now().timestamp() * 1000)
                data_batch.append(row_data)
    
                if len(data_batch) >= batch_size:
                    inserted = insert_batch_data(conn, data_batch)
                    print(f"Inserted {inserted} rows")
                    data_batch = []
    
            if data_batch:
                inserted = insert_batch_data(conn, data_batch)
                print(f"Inserted remaining {inserted} rows")
    
            cost_time = datetime.datetime.now().timestamp() - start_time
            print(f"Inserted {count} rows, cost {cost_time:.2f} seconds")
            print(f"Unique VINs inserted: {insert_vins}")
    
        finally:
            if conn.open:
                conn.close()
    

    参数说明

    参数

    说明

    user

    连接宽表引擎的默认用户名和默认初始密码。获取方式请参见访问实例

    password

    host

    宽表引擎的Lindorm宽表SQL地址(通过MySql兼容地址连接)。获取方法请参见访问实例

    重要

    填写时请删除末尾的半角冒号(:)和端口号。

    port

    宽表引擎连接端口号,固定为33060

    database

    数据库名称,默认连接default数据库。

  4. 执行以下命令运行脚本文件,将模拟车机原始报文数据批量导入。

    python3 demo.py

    执行结果如下:

    单击展开执行结果

    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 10000 rows
    Inserted 200000 rows, cost 35.83 seconds
    Unique VINs inserted: {'GQVjfWiEmVIcgrloM2l3gh****', 'j3dbUJGMfLgp3DAKZzkT0ef****', 'ReoD6EIoS6JhrZxdPABZxhwi****', 'caWfkP3NTsGuGlfXK0SWDHj****', 'zuDRFzPivwqB02aN5vuZlf****', 'JlEPOB66TuoDav3yrIZNBTo****', '90B7FwNXEYxzEuu9uMC3SNn****', 'wwVU0a45tulmrqVC7yvCZ****', 'WaP0GI5T9f7x0vtp8aUNP8p****', '5n7Aqrz2CbBz6zuNYGZnywD****'}
  5. 可选)验证数据导入结果。

    1. 再次使用Lindorm-cli连接宽表引擎。

      ./lindorm-cli -url <jdbc url> -username <默认用户名> -password <默认初始密码>
    2. 执行以下命令验证导入结果。

      SELECT * FROM dwd_vehicle_tbox LIMIT 10;

通过计算引擎进行复杂查询

创建列存索引

在进行复杂查询之前,您需要创建列存索引来增强数据分析计算能力,从而实现高效的数据查询。

  1. 通过Lindorm-cli连接宽表引擎。

    ./lindorm-cli -url <jdbc url> -username <username> -password <password>
  2. 创建列存索引column_index_dwd_vehi

    CREATE INDEX column_index_dwd_vehicle_tbox USING COLUMNAR
    ON dwd_vehicle_tbox(*)
    PARTITION BY ENUMERABLE (bucket(128, vin))
    WITH (`lindorm_columnar.user.index.database` = 'vehicle_db', `lindorm_columnar.user.index.table` = 'dwd_vehicle_tbox_column_idx');
  3. 可选)验证索引信息和状态。

    SHOW INDEX FROM dwd_vehicle_tbox;

    返回结果:

    +--------------+------------------+-------------------------------+-------------+----------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+
    | TABLE_SCHEMA |    DATA_TABLE    |          INDEX_NAME           | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED |                                                                                                                                                                                                                                                                                         INDEX_COLUMN                                                                                                                                                                                                                                                                                          | INDEX_TTL |            INDEX_DESCRIPTION            |
    +--------------+------------------+-------------------------------+-------------+----------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+
    | default      | dwd_vehicle_tbox | column_index_dwd_vehicle_tbox | ACTIVE      |                | COLUMNAR   | NA            | vin,sampletime,DriverStateLinkStatus,AirBagSystemStatus,HODHandoffmonitorValid,BodyCtrlModRollCounter,VehicleSpeed_kmph,SteeringAngle_Deg,BatterySOC_Percent,BrakePedalStatus,AcceleratorPedalPos_Percent,RegenBrakingLevel,CoolantTemperature_C,AEB_Activation,LaneAssistanceStatus,CruiseControlSpeedSet_kmph,ParkingAssistEngaged,RainSensorStatus,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi,LaneDepartureWarningActive,BatteryStateOfHealth_Percent,BatteryTemperature_Avg_C,BatteryMaxCellVoltage_V,BatteryMinCellVoltage_V,EvBatteryTemperature_C |           | index table:                            |
    |              |                  |                               |             |                |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | vehicle_db.dwd_vehicle_tbox_column_idx; |
    |              |                  |                               |             |                |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | task id:                                |
    |              |                  |                               |             |                |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | 8e60fb75-f01d-4a17-b1fc-9fb50ddc25a8;   |
    |              |                  |                               |             |                |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | partition by: [hash(128,vin)];          |
    |              |                  |                               |             |                |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | attributes: []                          |
    +--------------+------------------+-------------------------------+-------------+----------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+

    INDEX_STATEBUILDING变为ACTIVE时,表示索引已创建完成,此过程大概需等待3分钟。

复杂查询

  1. 可选)车辆的电池健康数据按照一定时间频率上传至Lindorm,在执行复杂查询之前您可以先使用简单的查询语句查看表中数据。

    例如,查询某一时间段内的10条电池数据。

    SELECT  vin,BatteryStateOfHealth_Percent FROM  lindorm_columnar.vehicle_db.dwd_vehicle_tbox_column_idx WHERE sampletime >= 1686585600000 AND BatteryStateOfHealth_Percent <= 80 LIMIT 10;

    返回结果:

    单击展开返回结果

    +----------------------------------+------------------------------+
    |               vin                | BatteryStateOfHealth_Percent |
    +----------------------------------+------------------------------+
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 23.764850669436843           |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 6.215661473439549            |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 12.852751497229441           |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 8.332735748118846            |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 19.596259310247877           |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 17.621117691572984           |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 66.77781508961095            |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 77.56923806011324            |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 25.969897299920774           |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 | 71.45633174979432            |
    +----------------------------------+------------------------------+
  2. 查询每辆车最后一次上报的记录,并根据电池健康程度排序,查询电池健康度最低的前10辆汽车和电池信息。

    SELECT vin,BatteryStateOfHealth_Percent FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY vin ORDER BY sampletime DESC) AS rn FROM lindorm_table.`default`.dwd_vehicle_tbox WHERE sampletime >= 1686585600000) AS tmp WHERE rn=1 ORDER BY BatteryStateOfHealth_Percent ASC LIMIT 10;

    返回结果:

    单击展开返回结果

    +----------------------------------+------------------------------+
    |               vin                | BatteryStateOfHealth_Percent |
    +----------------------------------+------------------------------+
    | j878HLSbLco8jSVVyTY8CMUZqfkUs28v | 20.652739801362372           |
    | echVK3CaoAYBSPoKxbaCrMEW8y4BTpmg | 21.518064804363355           |
    | SLJ1mkIbwBaiSLZO9xc1gy0cbUK69ULc | 23.388871500485052           |
    | DgBXmx0idrLeSVq08RobnYPxl45sYchb | 27.994995362735676           |
    | 4pJpua6dn1jzTevlI0NsruBe91rVVix9 | 30.321789199354043           |
    | CgO3PchAjoKprtBrFbyCG5kK3UGkBcpQ | 31.9348912927222             |
    | 3gP6BebgBxACvguf0de6juIiwdoCWvWB | 33.72344917241882            |
    | iMJY8rDr08tFe4BHFQtkalhQ5KSdyOMD | 36.89775232730048            |
    | Dsn9Wzr65FVZWaq1ajeV6uH7rFLYOH8h | 44.50827494756204            |
    | Yxoi4mTxvWJB7hKmlPkCnbgK9nUY7Ba2 | 66.27943854842643            |
    +----------------------------------+------------------------------+

通过搜索引擎进行多维检索

通过搜索索引执行多维检索耗时更短效率更高。您可以根据以下步骤,对比针对同一查询条件时使用搜索索引和无搜索索引的查询效率。

未创建搜索索引

基于电池健康和胎压两个维度,查询过去一年中电池健康程度低(小于50)并且胎压过低(胎压指标小于2) 的车辆。

-- 1686585600000 = 2023-06-13 0:0:00
SELECT DISTINCT(vin) FROM dwd_vehicle_tbox WHERE  sampletime >= 1686585600000 AND BatteryStateOfHealth_Percent < 50 AND (TirePressure_FL_psi < 2 OR TirePressure_FR_psi < 2 OR TirePressure_RL_psi < 2 OR TirePressure_RR_psi < 2);
重要

默认情况下,若查询的WHERE条件为非主键列时,查询将报错。您可以在语句中添加HINT参数_l_allow_filtering_强制执行低效查询。例如SELECT /*+ _l_allow_filtering_ */ DISTINCT(vin) FROM dwd_vehicle_tbox WHERE sampletime >= 1686585600000;

返回结果:

单击展开返回结果

+----------------------------------+
|               vin                |
+----------------------------------+
| 0JImIThOLvmYbKmhCP1Mact83E7XvF6s |
| 4spNfR8OhEsDXXaZADS3jivPQUGPXUQo |
| 59ydPuK3xdCvBV8wB1Y5UHsmWfO2aNQj |
| 5Kq9BkgTzNSexZ3fd3XL7AaF56NNVXHu |
| EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 |
| EwB2929l43ttvFNudMZDogppzbXfzYJ1 |
| FaXdxPwK0An7LbaeUV0r8PmqPoBz7Tn9 |
| KDx9AF9qrr4zhJR3sXsuEmVIANjTj8wg |
| LsvywOyn1lLjbrzEghQlHk3aXHfVr8Py |
| SivBFi3uzuUQT9bjO4jrIO7NEd9PYd55 |
| YC6zOBs7h57aqjIGZddDtzZ2YXfREnG2 |
| hkCS5GQ5sHBy2uyPEj7ifGXs21L4EUHu |
| k0kXqJMvx4gyOWfFUIHG6d4N2K8GFdDP |
| mHFfXFIGeItuZM4G9WYyqrEwyMrumsrZ |
| mXtpBVucRZVdKC2FH9MfP0i3MJCOsXXn |
| nH5YV2MAh3EDA14r2efpIHtIMp3AdsH4 |
| rXVDXz7JZ0PpvBgWu79bsKBWmcykxbnJ |
| rfsvhAgRbikInQ6O7gHDztLNWwQnZjVl |
| xU6qTtaDesFrSlQVLkZDe0vQE15gd5VE |
| yWuGjDH9fyRNAlF7k7HUe4GQFHHzSh9Y |
+----------------------------------+
20 rows in set (94912 ms)

该查询为全表扫描,总耗时为94912 ms。

使用搜索索引

  1. 再次通过Lindorm-cli连接宽表引擎。

    ./lindorm-cli -url <jdbc url> -username <username> -password <password>
  2. 创建搜索索引。

    CREATE INDEX IF NOT EXISTS dwd_vehicle_tbox_search_idx USING SEARCH ON dwd_vehicle_tbox (BatteryStateOfHealth_Percent,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi);
  3. (可选)查询搜索索引的状态。

    SHOW INDEX FROM dwd_vehicle_tbox;

    返回结果:

    +--------------+------------------+-------------------------------+-------------+-------------------------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+
    | TABLE_SCHEMA |    DATA_TABLE    |          INDEX_NAME           | INDEX_STATE |        INDEX_PROGRESS         | INDEX_TYPE | INDEX_COVERED |                                                                                                                                                                                                                                                                                         INDEX_COLUMN                                                                                                                                                                                                                                                                                          | INDEX_TTL |            INDEX_DESCRIPTION            |
    +--------------+------------------+-------------------------------+-------------+-------------------------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+
    | default      | dwd_vehicle_tbox | dwd_vehicle_tbox_search_idx   | ACTIVE      | N/A                           | SEARCH     | NA            | BatteryStateOfHealth_Percent,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | -1        |                                         |
    | default      | dwd_vehicle_tbox | column_index_dwd_vehicle_tbox | ACTIVE      | 2024-07-08 10:40:09.388 +0800 | COLUMNAR   | NA            | vin,sampletime,DriverStateLinkStatus,AirBagSystemStatus,HODHandoffmonitorValid,BodyCtrlModRollCounter,VehicleSpeed_kmph,SteeringAngle_Deg,BatterySOC_Percent,BrakePedalStatus,AcceleratorPedalPos_Percent,RegenBrakingLevel,CoolantTemperature_C,AEB_Activation,LaneAssistanceStatus,CruiseControlSpeedSet_kmph,ParkingAssistEngaged,RainSensorStatus,TirePressure_FL_psi,TirePressure_FR_psi,TirePressure_RL_psi,TirePressure_RR_psi,LaneDepartureWarningActive,BatteryStateOfHealth_Percent,BatteryTemperature_Avg_C,BatteryMaxCellVoltage_V,BatteryMinCellVoltage_V,EvBatteryTemperature_C |           | index table:                            |
    |              |                  |                               |             |                               |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | vehicle_db.dwd_vehicle_tbox_column_idx; |
    |              |                  |                               |             |                               |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | task id:                                |
    |              |                  |                               |             |                               |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | 8e60fb75-f01d-4a17-b1fc-9fb50ddc25a8;   |
    |              |                  |                               |             |                               |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | partition by: [hash(128,vin)];          |
    |              |                  |                               |             |                               |            |               |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |           | attributes: []                          |
    +--------------+------------------+-------------------------------+-------------+-------------------------------+------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-----------------------------------------+

    INDEX_STATEBUILDING变为ACTIVE时,表示索引已创建完成。

    说明

    如果索引状态一直没有变为ACTIVE状态,可以通过LTS控制台查看搜索索引实时同步以及全量同步的执行情况。

    查看方式:在LTS控制台左侧导航栏选择Lindorm Search > 全量同步,单击目标任务名。如何登录LTS,请参见登录LTS

  4. 使用相同查询语句查询数据。

    基于电池健康和胎压两个维度,查询过去一年电池健康程度低(小于50)且胎压过低(胎压指标小于2) 的车辆。

    -- 1686585600000 = 2023-06-13 0:0:00
    SELECT DISTINCT(vin) FROM dwd_vehicle_tbox WHERE  sampletime >= 1686585600000 AND BatteryStateOfHealth_Percent < 50 AND (TirePressure_FL_psi < 2 OR TirePressure_FR_psi < 2 OR TirePressure_RL_psi < 2 OR TirePressure_RR_psi < 2);
    重要

    默认情况下,若查询的WHERE条件为非主键列时,查询将报错。您可以在语句中添加HINT参数_l_allow_filtering_强制执行低效查询。例如SELECT /*+ _l_allow_filtering_ */ DISTINCT(vin) FROM dwd_vehicle_tbox WHERE sampletime >= 1686585600000;

    返回结果:

    单击展开返回结果

    +----------------------------------+
    |               vin                |
    +----------------------------------+
    | 0JImIThOLvmYbKmhCP1Mact83E7XvF6s |
    | 4spNfR8OhEsDXXaZADS3jivPQUGPXUQo |
    | 59ydPuK3xdCvBV8wB1Y5UHsmWfO2aNQj |
    | 5Kq9BkgTzNSexZ3fd3XL7AaF56NNVXHu |
    | EEL5dgXYFjra8jF3tNOUuZPFL0Imh906 |
    | EwB2929l43ttvFNudMZDogppzbXfzYJ1 |
    | FaXdxPwK0An7LbaeUV0r8PmqPoBz7Tn9 |
    | KDx9AF9qrr4zhJR3sXsuEmVIANjTj8wg |
    | LsvywOyn1lLjbrzEghQlHk3aXHfVr8Py |
    | SivBFi3uzuUQT9bjO4jrIO7NEd9PYd55 |
    | YC6zOBs7h57aqjIGZddDtzZ2YXfREnG2 |
    | hkCS5GQ5sHBy2uyPEj7ifGXs21L4EUHu |
    | k0kXqJMvx4gyOWfFUIHG6d4N2K8GFdDP |
    | mHFfXFIGeItuZM4G9WYyqrEwyMrumsrZ |
    | mXtpBVucRZVdKC2FH9MfP0i3MJCOsXXn |
    | nH5YV2MAh3EDA14r2efpIHtIMp3AdsH4 |
    | rXVDXz7JZ0PpvBgWu79bsKBWmcykxbnJ |
    | rfsvhAgRbikInQ6O7gHDztLNWwQnZjVl |
    | xU6qTtaDesFrSlQVLkZDe0vQE15gd5VE |
    | yWuGjDH9fyRNAlF7k7HUe4GQFHHzSh9Y |
    +----------------------------------+
    20 rows in set (14321 ms)

    可以从返回结果看出,在相同查询条件下未创建搜索索引时全表查询耗时94912 ms,使用了搜索索引后查询耗时14321 ms,时延大幅降低。

    说明

    搜索引擎在复杂多条件的查询下延迟更低,更适用于涉及在线查询业务较多的场景,而计算引擎更适合做更加复杂的查询,例如有离线分析需求的场景。