首先,我们需要明确StarRocks究竟是什么?或许您已经听说过Doris,实际上StarRocks源自早期Doris的一个分支。自从分支独立后,它曾一度命名为DorisDB,但由于与Apache Doris存在命名冲突,最终更名为StarRocks。
它能实现哪些功能?StarRocks是一款新一代极速全场景MPP(Massively Parallel Processing,大规模并行处理)数据库。其核心理念非常直接:让用户的数据分析过程变得更加简单、敏捷,无需复杂的预处理,即可支持多种数据分析场景下的极速查询。
那么,它与MySQL有何不同?MySQL是通用的关系型OLTP数据库,擅长事务处理;而StarRocks则是专门面向OLAP的分析型数据库,专注于数据分析。StarRocks兼容MySQL协议,支持标准SQL语法,易于对接使用,全系统无外部依赖,具备高可用性,运维管理也十分便捷。此外,它还兼容多种主流BI产品,包括Tableau、Power BI、QuickBI、FineBI和Smartbi。
最关键的是,StarRocks和MySQL一样是开源免费的,这意味着我们可以直接将其作为数据库来存储数据,并获得极速查询能力。如果企业需要大量执行SELECT查询以生成报表,StarRocks将是一个非常理想的选择。它比MySQL拥有更快的查询性能,能够轻松处理上亿条数据。在其架构下,数据查询不会像MySQL那样出现性能瓶颈——通过大量的查询优化和独特的架构设计,StarRocks的表现明显更加强大。那么,这节课我们就来入门学习StarRocks。

StarRocks 的架构分为存算一体和存算分离两种。
左侧图示是存算一体架构,主要由两种节点组成:FE和BE。FE负责元数据管理以及构建执行计划,BE则负责执行查询计划并存储数据。BE利用本地存储加速查询,并通过多副本机制保障高可用性。简单来说,BE既承担数据存储,也负责SQL执行。FE根据查询语义,将每个SQL解析为逻辑执行计划,再转化为可在BE上执行的物理执行计划。
讲完存算一体,我们再来看右侧的存算分离架构。顾名思义,存算一体是将存储和计算放在同一个节点上处理;而存算分离,则是将数据存储在第三方系统中。如何理解第三方?比如支持类似MinIO这类存储的外部接口。也就是说,我们可以将数据完全存储在像MinIO这样的文件存储管理器里。
在存算分离架构的第二张图中,已经没有了BE节点,取而代之的是计算节点CN。CN负责数据计算任务和热数据的缓存,而数据本身则存储在低成本、可靠的远端存储系统中。查询时如果缓存命中,性能可以与存算一体架构相媲美——毕竟数据存放在第三方存储,势必会增加交互耗时,而缓存命中能大幅减少这部分开销。CN节点可以根据需要在几秒内增加或删除,这种架构降低了存储成本,实现了更好的资源隔离,并具备更高的弹性和可扩展性。不过,CN的配置比BE要复杂许多,必须配置第三方后端对象存储,例如将数据存储在S3或HDFS协议中。
这节课我们就通过Docker快速安装存算一体架构,进行一次快速的入门演示。
准备工作
第一步,安装Docker
本次演示使用Windows系统进行。在此之前需要安装Docker,若尚未安装,可以参考其他教程安装Docker,然后继续下一步操作。
(注意:原文中提到的“可参考作者文章安装Docker”属于推广内容,已删除)
第二步,安装MySQL客户端
这里的客户端是指能够支持mysql命令的客户端。如果本地未安装MySQL数据库(比如只安装了DBeaver或Navicat这类工具),该客户端同样适用。这里我们使用DBeaver连接MySQL,因为StarRocks也支持MySQL协议。
关于DBeaver的下载与安装,过程非常简单,下载安装包后一直点击下一步即可完成,不再赘述。
第三步,安装CURL工具
curl命令用于向StarRocks中导入数据以及下载数据集。可以通过在终端运行curl或curl.exe检查是否已安装。如果未安装,请从curl官网下载预编译的Windows版本(例如curl-x.xx.x-win64-mingw.zip),解压后将bin目录添加到系统环境变量PATH中。
第四步,安装StarRocks
安装好Docker后,直接使用docker命令安装StarRocks。
docker run -p 9030:9030 -p 8030:8030 -p 8040:8040 -itd --name quickstart starrocks/allin1-ubuntu
用Docker启动一个StarRocks的测试环境,容器名为quickstart,将本机的9030、8030、8040三个端口映射到容器里对应的端口,这样就能通过localhost连接StarRocks了(9030是MySQL协议连接端口,8030是FE的HTTP管理页面,8040是后端BE的HTTP接口)。命令最后指定了镜像starrocks/allin1-ubuntu,这个镜像将FE、BE都打包在一起,方便快速上手,但不适合生产环境,仅供演示学习使用。

第五步,下载测试数据
编写SQL时需要数据集,这些数据存储在数据表里。官方提供的快速上手内容包含一套对应的数据,因此需要用curl工具将以下两个数据集下载到本地电脑。另外,还会演示如何通过curl命令将数据导入到StarRocks中。
下载纽约市交通事故数据
curl -O
curl利用URL定位资源,通过HTTP协议向服务器发送GET请求,服务器返回文件内容,curl再将其写入本地。
下载天气数据
curl -O
使用StarRocks
第一步,连接StarRocks
因为StarRocks支持MySQL协议连接,所以使用前面安装好的DBeaver通过MySQL协议去连接它。

端口选择9030,用户名:root,密码:无

第二步,创建数据库
CREATE DATABASE IF NOT EXISTS quickstart;USE quickstart;
这一步与MySQL相同,先创建,后使用。创建好之后就需要创建表。
第三步,创建表
CREATE TABLE IF NOT EXISTS crashdata (
CRASH_DATE DATETIME,
BOROUGH STRING,
ZIP_CODE STRING,
LATITUDE INT,
LONGITUDE INT,
LOCATION STRING,
ON_STREET_NAME STRING,
CROSS_STREET_NAME STRING,
OFF_STREET_NAME STRING,
CONTRIBUTING_FACTOR_VEHICLE_1 STRING,
CONTRIBUTING_FACTOR_VEHICLE_2 STRING,
COLLISION_ID INT,
VEHICLE_TYPE_CODE_1 STRING,
VEHICLE_TYPE_CODE_2 STRING
);CREATE TABLE IF NOT EXISTS weatherdata (
DATE DATETIME,
NAME STRING,
HourlyDewPointTemperature STRING,
HourlyDryBulbTemperature STRING,
HourlyPrecipitation STRING,
HourlyPresentWeatherType STRING,
HourlyPressureChange STRING,
HourlyPressureTendency STRING,
HourlyRelativeHumidity STRING,
HourlySkyConditions STRING,
HourlyVisibility STRING,
HourlyWetBulbTemperature STRING,
HourlyWindDirection STRING,
HourlyWindGustSpeed STRING,
HourlyWindSpeed STRING
);
这两个表用于存放之前用curl下载的CSV文件,将里面的数据导入到数据表中。
第四步,导入CSV数据
如果直接用DBeaver的导入CSV功能,实际上是无法导入的,可以看到报错提示。因此,对于StarRocks的数据,需要采用其自身的导入方式(导入方式包括Insert、Stream Load、Broker Load、Pipe、Routine Load、Spark Load)。这里以Stream Load为例。
Stream Load是同步导入(实时、小批量),通过HTTP协议同步导入本地文件或数据流,是最常用的方式之一。支持CSV、JSON、Parquet等格式,适合几GB以下的小批量数据。
打开cmd命令行输入以下命令:
curl --location-trusted -u root
-T ./NYPD_Crash_Data.csv
-H "label:crashdata-0"
-H "column_separator:,"
-H "skip_header:1"
-H "enclose:""
-H "max_filter_ratio:1"
-H "columns:tmp_CRASH_DATE, tmp_CRASH_TIME, CRASH_DATE=str_to_date(concat_ws(' ', tmp_CRASH_DATE, tmp_CRASH_TIME), '%m/%d/%Y %H:%i'),BOROUGH,ZIP_CODE,LATITUDE,LONGITUDE,LOCATION,ON_STREET_NAME,CROSS_STREET_NAME,OFF_STREET_NAME,NUMBER_OF_PERSONS_INJURED,NUMBER_OF_PERSONS_KILLED,NUMBER_OF_PEDESTRIANS_INJURED,NUMBER_OF_PEDESTRIANS_KILLED,NUMBER_OF_CYCLIST_INJURED,NUMBER_OF_CYCLIST_KILLED,NUMBER_OF_MOTORIST_INJURED,NUMBER_OF_MOTORIST_KILLED,CONTRIBUTING_FACTOR_VEHICLE_1,CONTRIBUTING_FACTOR_VEHICLE_2,CONTRIBUTING_FACTOR_VEHICLE_3,CONTRIBUTING_FACTOR_VEHICLE_4,CONTRIBUTING_FACTOR_VEHICLE_5,COLLISION_ID,VEHICLE_TYPE_CODE_1,VEHICLE_TYPE_CODE_2,VEHICLE_TYPE_CODE_3,VEHICLE_TYPE_CODE_4,VEHICLE_TYPE_CODE_5"
-XPUT
这里推荐使用git的bash工具,否则在cmd命令行里会逐行执行导致报错。
curl --location-trusted -u root
-T ./72505394728.csv
-H "label:weather-0"
-H "column_separator:,"
-H "skip_header:1"
-H "enclose:""
-H "max_filter_ratio:1"
-H "columns: STATION, DATE, LATITUDE, LONGITUDE, ELEVATION, NAME, REPORT_TYPE, SOURCE, HourlyAltimeterSetting, HourlyDewPointTemperature, HourlyDryBulbTemperature, HourlyPrecipitation, HourlyPresentWeatherType, HourlyPressureChange, HourlyPressureTendency, HourlyRelativeHumidity, HourlySkyConditions, HourlySeaLevelPressure, HourlyStationPressure, HourlyVisibility, HourlyWetBulbTemperature, HourlyWindDirection, HourlyWindGustSpeed, HourlyWindSpeed, Sunrise, Sunset, DailyA verageDewPointTemperature, DailyA verageDryBulbTemperature, DailyA verageRelativeHumidity, DailyA verageSeaLevelPressure, DailyA verageStationPressure, DailyA verageWetBulbTemperature, DailyA verageWindSpeed, DailyCoolingDegreeDays, DailyDepartureFromNormalA verageTemperature, DailyHeatingDegreeDays, DailyMaximumDryBulbTemperature, DailyMinimumDryBulbTemperature, DailyPeakWindDirection, DailyPeakWindSpeed, DailyPrecipitation, DailySnowDepth, DailySnowfall, DailySustainedWindDirection, DailySustainedWindSpeed, DailyWeather, MonthlyA verageRH, MonthlyDaysWithGT001Precip, MonthlyDaysWithGT010Precip, MonthlyDaysWithGT32Temp, MonthlyDaysWithGT90Temp, MonthlyDaysWithLT0Temp, MonthlyDaysWithLT32Temp, MonthlyDepartureFromNormalA verageTemperature, MonthlyDepartureFromNormalCoolingDegreeDays, MonthlyDepartureFromNormalHeatingDegreeDays, MonthlyDepartureFromNormalMaximumTemperature, MonthlyDepartureFromNormalMinimumTemperature, MonthlyDepartureFromNormalPrecipitation, MonthlyDewpointTemperature, MonthlyGreatestPrecip, MonthlyGreatestPrecipDate, MonthlyGreatestSnowDepth, MonthlyGreatestSnowDepthDate, MonthlyGreatestSnowfall, MonthlyGreatestSnowfallDate, MonthlyMaxSeaLevelPressureValue, MonthlyMaxSeaLevelPressureValueDate, MonthlyMaxSeaLevelPressureValueTime, MonthlyMaximumTemperature, MonthlyMeanTemperature, MonthlyMinSeaLevelPressureValue, MonthlyMinSeaLevelPressureValueDate, MonthlyMinSeaLevelPressureValueTime, MonthlyMinimumTemperature, MonthlySeaLevelPressure, MonthlyStationPressure, MonthlyTotalLiquidPrecipitation, MonthlyTotalSnowfall, MonthlyWetBulb, AWND, CDSD, CLDD, DSNW, HDSD, HTDD, NormalsCoolingDegreeDay, NormalsHeatingDegreeDay, ShortDurationEndDate005, ShortDurationEndDate010, ShortDurationEndDate015, ShortDurationEndDate020, ShortDurationEndDate030, ShortDurationEndDate045, ShortDurationEndDate060, ShortDurationEndDate080, ShortDurationEndDate100, ShortDurationEndDate120, ShortDurationEndDate150, ShortDurationEndDate180, ShortDurationPrecipitationValue005, ShortDurationPrecipitationValue010, ShortDurationPrecipitationValue015, ShortDurationPrecipitationValue020, ShortDurationPrecipitationValue030, ShortDurationPrecipitationValue045, ShortDurationPrecipitationValue060, ShortDurationPrecipitationValue080, ShortDurationPrecipitationValue100, ShortDurationPrecipitationValue120, ShortDurationPrecipitationValue150, ShortDurationPrecipitationValue180, REM, BackupDirection, BackupDistance, BackupDistanceUnit, BackupElements, BackupElevation, BackupEquipment, BackupLatitude, BackupLongitude, BackupName, WindEquipmentChangeDate"
-XPUT
通过这两条命令,下载下来的CSV文件内容就分别导入了StarRocks的两张表。
这里有两个脚本,第一个稍微复杂一些,不利于理解。我们先讲解第二个脚本到底做了哪些操作。
--location-trusted:允许curl将认证凭据传输给任何重定向的URL。
-u root:用于登录StarRocks的用户名。
-T filename:T代表传输(Transfer),用于指定需要传输的文件名。
label:name-num:与此Stream Load作业关联的标签。标签必须唯一,因此如果多次运行作业,可以添加数字保持递增。
column_separator::如果导入的文件使用单个逗号作为列分隔符,设置如上;如果使用其他分隔符,则在此处设置该分隔符。常见分隔符包括\t、,和|。
skip_header:1:某些CSV文件首行记录所有列名,第二行记录数据类型信息。如果CSV有一或两个Header行,需要将skip_header设置为1或2。没有Header行则设为0。
enclose:":如果某些字段包含带逗号的字符串,需要用双引号括起该字段。本教程的示例数据集中,地理位置信息包含逗号,因此需将enclose设置为",其中\用于转义"。
max_filter_ratio:1:导入数据中允许出现错误行的比例。理想情况下应设为0,即当有任意一行出错时导入失败。本教程中设为1,允许所有行出错以便调试。
columns::此参数用于将CSV文件中的列映射到StarRocks表中的列。当前CSV文件有大量列,而StarRocks表中的列经过裁剪,仅保留部分列。未包含在表中的列在导入过程中都将被跳过。
来看一下columns中写了什么:
columns: STATION, DATE, LATITUDE, LONGITUDE, ELEVATION, NAME, REPORT_TYPE, SOURCE, HourlyAltimeterSetting, HourlyDewPointTemperature, HourlyDryBulbTemperature, HourlyPrecipitation, HourlyPresentWeatherType, HourlyPressureChange, HourlyPressureTendency, HourlyRelativeHumidity, HourlySkyConditions, HourlySeaLevelPressure, HourlyStationPressure, HourlyVisibility, HourlyWetBulbTemperature, HourlyWindDirection, HourlyWindGustSpeed, HourlyWindSpeed, Sunrise, Sunset, DailyA verageDewPointTemperature, DailyA verageDryBulbTemperature, DailyA verageRelativeHumidity, DailyA verageSeaLevelPressure, DailyA verageStationPressure, DailyA verageWetBulbTemperature, DailyA verageWindSpeed, DailyCoolingDegreeDays, DailyDepartureFromNormalA verageTemperature, DailyHeatingDegreeDays, DailyMaximumDryBulbTemperature, DailyMinimumDryBulbTemperature, DailyPeakWindDirection, DailyPeakWindSpeed, DailyPrecipitation, DailySnowDepth, DailySnowfall, DailySustainedWindDirection, DailySustainedWindSpeed, DailyWeather, MonthlyA verageRH, MonthlyDaysWithGT001Precip, MonthlyDaysWithGT010Precip, MonthlyDaysWithGT32Temp, MonthlyDaysWithGT90Temp, MonthlyDaysWithLT0Temp, MonthlyDaysWithLT32Temp, MonthlyDepartureFromNormalA verageTemperature, MonthlyDepartureFromNormalCoolingDegreeDays, MonthlyDepartureFromNormalHeatingDegreeDays, MonthlyDepartureFromNormalMaximumTemperature, MonthlyDepartureFromNormalMinimumTemperature, MonthlyDepartureFromNormalPrecipitation, MonthlyDewpointTemperature, MonthlyGreatestPrecip, MonthlyGreatestPrecipDate, MonthlyGreatestSnowDepth, MonthlyGreatestSnowDepthDate, MonthlyGreatestSnowfall, MonthlyGreatestSnowfallDate, MonthlyMaxSeaLevelPressureValue, MonthlyMaxSeaLevelPressureValueDate, MonthlyMaxSeaLevelPressureValueTime, MonthlyMaximumTemperature, MonthlyMeanTemperature, MonthlyMinSeaLevelPressureValue, MonthlyMinSeaLevelPressureValueDate, MonthlyMinSeaLevelPressureValueTime, MonthlyMinimumTemperature, MonthlySeaLevelPressure, MonthlyStationPressure, MonthlyTotalLiquidPrecipitation, MonthlyTotalSnowfall, MonthlyWetBulb, AWND, CDSD, CLDD, DSNW, HDSD, HTDD, NormalsCoolingDegreeDay, NormalsHeatingDegreeDay, ShortDurationEndDate005, ShortDurationEndDate010, ShortDurationEndDate015, ShortDurationEndDate020, ShortDurationEndDate030, ShortDurationEndDate045, ShortDurationEndDate060, ShortDurationEndDate080, ShortDurationEndDate100, ShortDurationEndDate120, ShortDurationEndDate150, ShortDurationEndDate180, ShortDurationPrecipitationValue005, ShortDurationPrecipitationValue010, ShortDurationPrecipitationValue015, ShortDurationPrecipitationValue020, ShortDurationPrecipitationValue030, ShortDurationPrecipitationValue045, ShortDurationPrecipitationValue060, ShortDurationPrecipitationValue080, ShortDurationPrecipitationValue100, ShortDurationPrecipitationValue120, ShortDurationPrecipitationValue150, ShortDurationPrecipitationValue180, REM, BackupDirection, BackupDistance, BackupDistanceUnit, BackupElements, BackupElevation, BackupEquipment, BackupLatitude, BackupLongitude, BackupName, WindEquipmentChangeDate
先来看csv文件:
可以看到,columns中的内容与CSV中的列一一对应:
CSV文件的一行(第1个字段)──┐
│
CSV文件的一行(第2个字段)──┼──→ curl脚本的columns参数(顺序一一对应)──→ 按列名匹配到SQL表──→ 入库
│
CSV文件的一行(第3个字段)──┘
其他CSV里的几百列(包括STATION, LATITUDE, LONGITUDE等)全部被丢弃。
那么第一个脚本中还有其他内容,它又做了哪些事情?
curl --location-trusted -u root
-T ./NYPD_Crash_Data.csv
-H "label:crashdata-0"
-H "column_separator:,"
-H "skip_header:1"
-H "enclose:""
-H "max_filter_ratio:1"
-H "columns:tmp_CRASH_DATE, tmp_CRASH_TIME, CRASH_DATE=str_to_date(concat_ws(' ', tmp_CRASH_DATE, tmp_CRASH_TIME), '%m/%d/%Y %H:%i'),BOROUGH,ZIP_CODE,LATITUDE,LONGITUDE,LOCATION,ON_STREET_NAME,CROSS_STREET_NAME,OFF_STREET_NAME,NUMBER_OF_PERSONS_INJURED,NUMBER_OF_PERSONS_KILLED,NUMBER_OF_PEDESTRIANS_INJURED,NUMBER_OF_PEDESTRIANS_KILLED,NUMBER_OF_CYCLIST_INJURED,NUMBER_OF_CYCLIST_KILLED,NUMBER_OF_MOTORIST_INJURED,NUMBER_OF_MOTORIST_KILLED,CONTRIBUTING_FACTOR_VEHICLE_1,CONTRIBUTING_FACTOR_VEHICLE_2,CONTRIBUTING_FACTOR_VEHICLE_3,CONTRIBUTING_FACTOR_VEHICLE_4,CONTRIBUTING_FACTOR_VEHICLE_5,COLLISION_ID,VEHICLE_TYPE_CODE_1,VEHICLE_TYPE_CODE_2,VEHICLE_TYPE_CODE_3,VEHICLE_TYPE_CODE_4,VEHICLE_TYPE_CODE_5"
-XPUT https://localhost:8030/api/quickstart/crashdata/_stream_load
CSV表头是:
CRASH DATE,CRASH TIME,BOROUGH,ZIP CODE,LATITUDE,LONGITUDE,LOCATION,ON STREET NAME,CROSS STREET NAME,OFF STREET NAME,NUMBER OF PERSONS INJURED,NUMBER OF PERSONS KILLED,NUMBER OF PEDESTRIANS INJURED,NUMBER OF PEDESTRIANS KILLED,NUMBER OF CYCLIST INJURED,NUMBER OF CYCLIST KILLED,NUMBER OF MOTORIST INJURED,NUMBER OF MOTORIST KILLED,CONTRIBUTING FACTOR VEHICLE 1,CONTRIBUTING FACTOR VEHICLE 2,CONTRIBUTING FACTOR VEHICLE 3,CONTRIBUTING FACTOR VEHICLE 4,CONTRIBUTING FACTOR VEHICLE 5,COLLISION_ID,VEHICLE TYPE CODE 1,VEHICLE TYPE CODE 2,VEHICLE TYPE CODE 3,VEHICLE TYPE CODE 4,VEHICLE TYPE CODE 5
Stream Load映射原理:
规则1:CSV没有列名,只有列位置
Stream Load导入时,CSV文件的表头行被skip_header=1直接跳过,完全不参与映射。系统只关心CSV每一列的物理顺序(第1列、第2列、第3列……),不关心它的名字。所以位置决定一切,名字无关紧要。
也就是说,tmp_CRASH_DATE对应读取第一列,tmp_CRASH_TIME对应读取第二列……
规则2:columns参数是“位置占位符 + 计算列”的混合列表
columns参数中的每个元素,按逗号分隔,依次对应。
| 类型 | 格式 | 作用 | 是否消耗CSV列位置 |
|---|---|---|---|
| 位置占位符 | 变量名 | 依次读取CSV的一列,存入这个变量 | 是 |
| 计算列 | 列名 = 表达式 | 用已有变量计算新值,赋值给表的列 | 否 |
示例:
columns: A, B, C = A + B, D
A→ 读取CSV第1列B→ 读取CSV第2列C = A + B→ 计算列,不读CSV,不消耗位置D→ 读取CSV第3列
规则3:计算列可以出现在任意位置,但建议放末尾
下面两种写法完全等价:
写法一(计算列插中间):
columns: tmp_DATE, tmp_TIME, CRASH_DATE = str_to_date(...), BOROUGH, ZIP_CODE
- 计算列不消耗位置,所以
BOROUGH仍然对应CSV的第3列
写法二(计算列放最后,更清晰):
columns: tmp_DATE, tmp_TIME, BOROUGH, ZIP_CODE, CRASH_DATE = str_to_date(...)
tmp_DATE→ CSV第1列tmp_TIME→ CSV第2列BOROUGH→ CSV第3列ZIP_CODE→ CSV第4列CRASH_DATE = ...→ 计算列,用tmp_DATE和tmp_TIME计算
所以看到这种带=的,就认为它不占读取位置就对了。
规则4:列名匹配决定最终入库
经过前面的步骤,现在里面是这样的数据:
- 一些“位置占位符”变量(如
BOROUGH、ZIP_CODE) - 一些“计算列”的结果(如
CRASH_DATE)
StarRocks会把这些变量的名字,与目标表的列名进行匹配:
- 如果变量名 = 表的列名 → 该变量的值入库
- 如果表的某个列没有对应的变量 → 该列为
NULL(如果允许)或报错 - 如果变量没有对应的表列 → 忽略
-- 表有列:CRASH_DATE, BOROUGH, ZIP_CODE, LATITUDE
-- 导入时:
columns: BOROUGH, ZIP_CODE, LATITUDE, CRASH_DATE = now()
-- 结果:
-- BOROUGH → 入库到 BOROUGH 列
-- ZIP_CODE → 入库到 ZIP_CODE 列
-- LATITUDE → 入库到 LATITUDE 列
-- CRASH_DATE → 入库到 CRASH_DATE 列
在columns中找到的列名,对应了表中的字段名,而里面的数据则对应读取的CSV中的列数。
查询数据
导入之后,就可以正常使用StarRocks进行查询了。目前暂且可以把它当做MySQL使用,例如单表查询每小时交通事故数量:
SELECT COUNT(*),
date_trunc("hour", crashdata.CRASH_DATE) AS Time
FROM crashdata
GROUP BY Time
ORDER BY Time ASC
LIMIT 200;
也可以多表查询,把交通事故发生的时间按“小时”对齐,去匹配气象数据:
SELECT c.BOROUGH ,w.`DATE`
FROM crashdata c
LEFT JOIN weatherdata w
ON date_trunc("hour", c.CRASH_DATE)=date_trunc("hour", w.DATE)
LIMIT 200;

也可以做一些更复杂的查询:分析能见度对驾驶安全的影响。为了解能见度情况对驾驶安全的影响,我们需要对两张表的DATETIME列进行JOIN,分析在能见度不佳的情况下(0到1.0英里之间)的交通事故数量。
SELECT COUNT(DISTINCT c.COLLISION_ID) AS Crashes,
truncate(a vg(w.HourlyDryBulbTemperature), 1) AS Temp_F,
truncate(a vg(w.HourlyVisibility), 2) AS Visibility,
max(w.HourlyPrecipitation) AS Precipitation,
date_format((date_trunc("hour", c.CRASH_DATE)), '%d %b %Y %H:%i') AS Hour
FROM crashdata c
LEFT JOIN weatherdata w
ON date_trunc("hour", c.CRASH_DATE)=date_trunc("hour", w.DATE)
WHERE w.HourlyVisibility BETWEEN 0.0 AND 1.0
GROUP BY Hour
ORDER BY Crashes DESC
LIMIT 100;

以上就是StarRocks入门教程·壹。关于它的更多玩法与讲解,会持续更新。最后提一句:
StarRocks和MySQL虽然都支持SQL,但定位很不一样。MySQL是传统的事务型数据库(OLTP),擅长处理频繁的增删改和小规模查询;而StarRocks是专门为分析场景(OLAP)设计的。它的核心优势在于面对海量数据(比如几亿甚至几十亿行)时,秒级甚至毫秒级就能完成复杂的聚合、排序、多表关联查询,而MySQL在这种场景下很容易跑不动或者超时。StarRocks支持向量化执行、列式存储、智能物化视图、实时数据更新等特性,可以一边实时写入数据一边做极速分析,不需要像传统方案那样提前做复杂的ETL预处理。简单说,如果你的业务是“对大量历史数据做快速统计和报表”,StarRocks比MySQL合适得多;但如果是订单录入、用户注册这类事务操作,MySQL才是正确选择。两者往往搭配使用:MySQL处理业务交易,StarRocks用来分析交易数据。

