blob: 0efeba2eb0dd80f52048feebc37b98c7500cac3d [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
[English](./README.md) | [中文](./README-zh.md)
# TsFile Tools 手册
## 简介
## 开发
### 前置条件
构建 Java 版的 TsFile Tools,必须要安装以下依赖:
1. Java >= 1.8 (1.8, 11 到 17 都经过验证. 请确保设置了环境变量).
2. Maven >= 3.6 (如果要从源代码编译TsFile).
### 使用 maven 构建
```
mvn clean package -P with-java -DskipTests
```
### 安装到本地机器
```
mvn install -P with-java -DskipTests
```
## schema 定义
### 参数
| 参数 | 说明 | 是否必填 | 默认值 |
|------|------|---------|--------|
| table_name | 表名 | 是 | |
| time_precision | 时间精度(ms / us / ns / s) | 否 | ms |
| has_header | CSV 是否包含表头(true / false),Parquet / Arrow 忽略此项 | 否 | true |
| separator | CSV 行内分隔符(, / tab / ;),Parquet / Arrow 忽略此项 | 否 | , |
| null_format | CSV 中视为 null 的字符串,Parquet / Arrow 忽略此项(使用原生 null) | 否 | |
| tag_columns | 标签列(设备标识 / 联合主键),支持 DEFAULT 虚拟列 | 否 | |
| time_column | 时间列名称 | 是 | |
| source_columns | 源文件列定义,映射源文件中的每一列 | 是 | |
> **向后兼容**:`id_columns` 和 `csv_columns` 仍然可用,分别作为 `tag_columns` 和 `source_columns` 的别名。
### 列概念
- **time_column**:每个表有且仅有一个时间列,写入 TsFile 后列名固定为 `time`,类型为 `TIMESTAMP`。
- **tag_columns**:设备标识列(联合主键),可以为 0 到多个。支持通过 `DEFAULT` 关键字定义不在源文件中的虚拟列。
- **source_columns**:映射源文件中的所有列,CSV 按位置对应,Parquet / Arrow 按列名匹配。使用 `SKIP` 跳过不需要的列。
- **FIELD**(推导结果,非配置项):`source_columns` 中去掉 `time_column`、`tag_columns`、`SKIP` 后的剩余列,即为测点列,其值随时间变化。
### Schema 示例
CSV 文件内容:
```
Region,FactoryNumber,DeviceNumber,Model,MaintenanceCycle,Time,Temperature,Emission
hebei,1001,1,10,1,1,80.0,1000.0
hebei,1001,1,10,1,4,80.0,1000.0
hebei,1002,7,5,2,1,90.0,1200.0
```
Schema 文件(`import.schema`):
```
table_name=root.db1
time_precision=ms
has_header=true
separator=,
null_format=\N
tag_columns
Group DEFAULT Datang
Region
FactoryNumber
DeviceNumber
time_column=Time
source_columns
Region TEXT,
FactoryNumber TEXT,
DeviceNumber TEXT,
SKIP,
SKIP,
Time INT64,
Temperature FLOAT,
Emission DOUBLE,
```
说明:
- `Group` 是虚拟标签列(不在 CSV 中),默认值为 `Datang`
- `Region`、`FactoryNumber`、`DeviceNumber` 是从 CSV 中读取的标签列
- `Model` 和 `MaintenanceCycle` 通过 `SKIP` 跳过
- `Temperature` 和 `Emission` 自动推导为 FIELD 列
Parquet / Arrow 在 schema 模式下,`source_columns` 按列**名称**匹配而非位置。也支持命名 SKIP:
```
source_columns
Time INT64,
unused_col SKIP,
Temperature FLOAT,
Emission DOUBLE,
```
## 命令行参数
| 参数 | 说明 | 是否必填 | 默认值 |
|------|------|---------|--------|
| -s, --source | 输入文件或目录 | 是 | |
| -t, --target | 输出目录 | 是 | |
| --schema | Schema 文件路径,不传则进入 auto 模式 | 否 | |
| --fail_dir | 失败文件存放目录 | 否 | failed |
| --format | 源格式:csv / parquet / arrow,不传则按文件扩展名自动识别 | 否 | 自动识别 |
| --table_name | 表名覆盖(auto 模式) | 否 | 从文件名推导 |
| --time_precision | 时间精度覆盖(auto 模式):ms / us / ns / s | 否 | ms |
| --separator | CSV 分隔符(auto 模式):, / tab / ; | 否 | , |
| -b, --block_size | CSV 分块大小(如 256M、1G) | 否 | 256M |
| -tn, --thread_num | 并行处理线程数 | 否 | 8 |
## 模式
### Schema 模式
传入 `--schema` 文件,显式定义列映射、类型、标签列和时间列。
```sh
# CSV
csv2tsfile.sh --source ./data/csv --target ./output --fail_dir ./failed --schema ./schema/import.schema
csv2tsfile.bat --source .\data\csv --target .\output --fail_dir .\failed --schema .\schema\import.schema
# Parquet
parquet2tsfile.sh --source ./data/parquet --target ./output --fail_dir ./failed --schema ./schema/import.schema
parquet2tsfile.bat --source .\data\parquet --target .\output --fail_dir .\failed --schema .\schema\import.schema
# Arrow
arrow2tsfile.sh --source ./data/arrow --target ./output --fail_dir ./failed --schema ./schema/import.schema
arrow2tsfile.bat --source .\data\arrow --target .\output --fail_dir .\failed --schema .\schema\import.schema
```
### Auto 模式
不传 `--schema`,自动推断列类型并识别时间列。
**Auto 模式规则:**
- 时间列:必须严格命名为 `time` 或 `TIME`(区分大小写)
- 其余所有列自动成为 FIELD(不自动推断标签列)
- CSV 类型推断基于前 100 行采样。提升规则:INT64 和 DOUBLE 混合提升为 DOUBLE;其他任何混合对(包括 BOOLEAN 与数字类型)直接提升为 STRING。
- Parquet / Arrow 直接使用原生 schema 类型
- 默认表名:从源文件名推导(如 `sensor.csv` → 表名 `sensor`)
- 默认 null 识别(仅 CSV):空单元格和 `\N`
**Auto 模式示例:**
CSV 文件(`sensor.csv`):
```
time,temperature,humidity,status
1000,25.5,60.0,true
2000,26.1,55.3,false
3000,27.0,58.1,true
```
Auto 模式推断结果:
```
表名: sensor (从文件名推导)
时间列: time
FIELD 列: temperature DOUBLE, humidity DOUBLE, status BOOLEAN
标签列: (无)
```
**命令:**
```sh
# CSV
csv2tsfile.sh --source ./data/csv --target ./output --fail_dir ./failed
csv2tsfile.bat --source .\data\csv --target .\output --fail_dir .\failed
# CSV 带可选参数
csv2tsfile.sh --source ./data/csv --target ./output --table_name my_table --separator tab --time_precision us
# Parquet
parquet2tsfile.sh --source ./data/parquet --target ./output --fail_dir ./failed
parquet2tsfile.bat --source .\data\parquet --target .\output --fail_dir .\failed
# Arrow(.arrow / .ipc / .feather)
arrow2tsfile.sh --source ./data/arrow --target ./output --fail_dir ./failed
arrow2tsfile.bat --source .\data\arrow --target .\output --fail_dir .\failed
```
### 输出文件命名
- 单批次:`{源文件名}.tsfile`
- 多批次:`{源文件名}_1.tsfile`、`{源文件名}_2.tsfile`、...
- 表名与输出文件名相互独立——表名来自 schema 或 `--table_name`,文件名来自源文件。