文档文档

将 CSV 数据写入 InfluxDB

使用以下方法写入 CSV 数据

influx write 命令

使用 influx write 命令 将 CSV 数据写入 InfluxDB。包含 Extended annotated CSV 注解以指定数据如何转换为 line protocol。在 CSV 文件中包含注解,或使用 influx write 命令的 --header 标志注入它们。

本页内容
示例写入命令
influx write -b example-bucket -f path/to/example.csv
example.csv
#datatype measurement,tag,double,dateTime:RFC3339
m,host,used_percent,time
mem,host1,64.23,2020-01-01T00:00:00Z
mem,host2,72.01,2020-01-01T00:00:00Z
mem,host1,62.61,2020-01-01T00:00:10Z
mem,host2,72.98,2020-01-01T00:00:10Z
mem,host1,63.40,2020-01-01T00:00:20Z
mem,host2,73.77,2020-01-01T00:00:20Z
生成的 Line Protocol
mem,host=host1 used_percent=64.23 1577836800000000000
mem,host=host2 used_percent=72.01 1577836800000000000
mem,host=host1 used_percent=62.61 1577836810000000000
mem,host=host2 used_percent=72.98 1577836810000000000
mem,host=host1 used_percent=63.40 1577836820000000000
mem,host=host2 used_percent=73.77 1577836820000000000

要测试 CSV 到 line protocol 的转换过程,请使用 influx write dryrun 命令将生成的 line protocol 打印到 stdout,而不是写入 InfluxDB。

“打开文件过多” 错误

当尝试将大量 CSV 数据写入 InfluxDB 时,您可能会看到如下错误

Error: Failed to write data: unexpected error writing points to database: [shard <#>] fcntl: too many open files.

要在 Linux 或 macOS 上修复此错误,请运行以下命令以增加允许打开的文件数

ulimit -n 10000

macOS 用户,要持久化 ulimit 设置,请按照您的操作系统版本的推荐步骤操作。

Telegraf

在 Telegraf 中使用 CSV 数据格式作为将 CSV 数据写入 InfluxDB 的一种方式。

更多信息,请参阅

CSV 注解

使用 CSV 注解 来指定每个 CSV 列代表 line protocol 的哪个元素以及如何格式化数据。CSV 注解是 CSV 文件开头的行,用于描述列属性。

influx write 命令支持 Extended annotated CSV,它提供了用于指定 CSV 数据应如何转换为 line protocol 以及数据如何格式化的选项。

要将数据写入 InfluxDB,数据必须包含以下内容

使用 CSV 注解来指定每列代表这些元素中的哪一个。

将原始查询结果写回 InfluxDB

Flux 以 annotated CSV 格式返回查询结果。这些结果包含将数据写回 InfluxDB 所需的所有注解。

注入注解标头

如果您要写入 InfluxDB 的 CSV 数据不包含将数据正确转换为 line protocol 所需的注解,请使用 --header 标志将注解行注入到 CSV 数据中。

influx write -b example-bucket \
  -f path/to/example.csv \
  --header "#constant measurement,birds" \
  --header "#datatype dateTime:2006-01-02,long,tag"
example.csv
date,sighted,loc
2020-01-01,12,Boise
2020-06-01,78,Boise
2020-01-01,54,Seattle
2020-06-01,112,Seattle
2020-01-01,9,Detroit
2020-06-01,135,Detroit
生成的 Line Protocol
birds,loc=Boise sighted=12i 1577836800000000000
birds,loc=Boise sighted=78i 1590969600000000000
birds,loc=Seattle sighted=54i 1577836800000000000
birds,loc=Seattle sighted=112i 1590969600000000000
birds,loc=Detroit sighted=9i 1577836800000000000
birds,loc=Detroit sighted=135i 1590969600000000000

使用文件注入标头

influx write 命令支持在单个命令中导入多个文件。将注解和标头行包含在它们自己的文件中,并使用 write 命令导入它们。文件按照它们提供的顺序读取。

influx write -b example-bucket \
  -f path/to/headers.csv \
  -f path/to/example.csv
headers.csv
#constant measurement,birds
#datatype dateTime:2006-01-02,long,tag
example.csv
date,sighted,loc
2020-01-01,12,Boise
2020-06-01,78,Boise
2020-01-01,54,Seattle
2020-06-01,112,Seattle
2020-01-01,9,Detroit
2020-06-01,135,Detroit
生成的 Line Protocol
birds,loc=Boise sighted=12i 1577836800000000000
birds,loc=Boise sighted=78i 1590969600000000000
birds,loc=Seattle sighted=54i 1577836800000000000
birds,loc=Seattle sighted=112i 1590969600000000000
birds,loc=Detroit sighted=9i 1577836800000000000
birds,loc=Detroit sighted=135i 1590969600000000000

跳过注解标头

某些 CSV 数据可能包含与写入 InfluxDB 的 CSV 数据所需的注解冲突或缺少注解的标头行。使用 --skipHeader 标志来指定要跳过的行数,从 CSV 数据的开头算起。

influx write -b example-bucket \
  -f path/to/example.csv \
  --skipHeader=2

然后,您可以注入新的标头行以重命名列并提供必要的注解。

将输入处理为 CSV

influx write 命令自动将扩展名为 .csv 的文件处理为 CSV 文件。如果您的 CSV 文件使用不同的扩展名,请使用 --format 标志显式声明输入文件的格式。

influx write -b example-bucket \
  -f path/to/example.txt \
  --format csv

除非输入文件包含 .csv 扩展名,或者您声明了 csv,否则 influx write 命令假定所有输入文件都是 line protocol。

指定 CSV 字符编码

influx write 命令假定 CSV 文件包含 UTF-8 编码的字符。如果您的 CSV 数据使用不同的字符编码,请使用 --encoding 指定编码。

influx write -b example-bucket \
  -f path/to/example.csv \
  --encoding "UTF-16"

跳过包含错误的行

如果 CSV 数据中的某一行缺少写入 InfluxDB 所需的元素,或者数据格式不正确,则在处理该行时,influx write 命令会返回错误并取消写入请求。要跳过包含错误的行,请使用 --skipRowOnError 标志。

influx write -b example-bucket \
  -f path/to/example.csv \
  --skipRowOnError

跳过的行将被忽略,并且不会写入 InfluxDB。

使用 --errors-file 标志将错误记录到文件中。错误文件标识所有无法导入的行,并包含用于调试的错误消息。例如

cpu,1.1

高级示例


定义常量

使用 Extended annotated CSV #constant 注解 向 CSV 数据中的每一行添加列和值。

带有常量的 CSV
#constant measurement,example
#constant tag,source,csv
#datatype long,dateTime:RFC3339
count,time
1,2020-01-01T00:00:00Z
4,2020-01-02T00:00:00Z
9,2020-01-03T00:00:00Z
18,2020-01-04T00:00:00Z
生成的 Line Protocol
example,source=csv count=1 1577836800000000000
example,source=csv count=4 1577923200000000000
example,source=csv count=9 1578009600000000000
example,source=csv count=18 1578096000000000000

注解简写

Extended annotated CSV 支持 注解简写,它允许您在列标头中定义列标签数据类型默认值

带有注解简写的 CSV
m|measurement,count|long|0,time|dateTime:RFC3339
example,1,2020-01-01T00:00:00Z
example,4,2020-01-02T00:00:00Z
example,,2020-01-03T00:00:00Z
example,18,2020-01-04T00:00:00Z
生成的 Line Protocol
example count=1 1577836800000000000
example count=4 1577923200000000000
example count=0 1578009600000000000
example count=18 1578096000000000000

用注解简写替换列标头

可以替换 CSV 文件中的列标头行为注解简写,而无需修改 CSV 文件。这使您可以在写入 InfluxDB 时定义列数据类型和默认值。

要用注解简写替换现有的列标头行

  1. 使用 --skipHeader 标志忽略现有的列标头行。
  2. 使用 --header 标志注入使用注解简写的新列标头行。
influx write -b example-bucket \
  -f example.csv \
  --skipHeader=1
  --header="m|measurement,count|long|0,time|dateTime:RFC3339"
未修改的 example.csv
m,count,time
example,1,2020-01-01T00:00:00Z
example,4,2020-01-02T00:00:00Z
example,,2020-01-03T00:00:00Z
example,18,2020-01-04T00:00:00Z
生成的 Line Protocol
example count=1i 1577836800000000000
example count=4i 1577923200000000000
example count=0i 1578009600000000000
example count=18i 1578096000000000000

忽略列

使用 Extended annotated CSV #datatype ignored 注解 在将 CSV 数据写入 InfluxDB 时忽略列。

带有忽略列的 CSV 数据
#datatype measurement,long,time,ignored
m,count,time,foo
example,1,2020-01-01T00:00:00Z,bar
example,4,2020-01-02T00:00:00Z,bar
example,9,2020-01-03T00:00:00Z,baz
example,18,2020-01-04T00:00:00Z,baz
生成的 Line Protocol
m count=1i 1577836800000000000
m count=4i 1577923200000000000
m count=9i 1578009600000000000
m count=18i 1578096000000000000

使用备用数字格式

如果您的 CSV 数据包含使用非默认小数分隔符 (.) 或包含分组分隔符的数值,请在 doublelongunsignedLong 数据类型注解中定义您的数字格式

如果您的数字格式分隔符包含逗号 (,),请将列注解用双引号 ("") 括起来,以防止逗号被解析为列分隔符或定界符。您还可以定义自定义列分隔符

带有非默认浮点数值的 CSV
#datatype measurement,"double:.,",dateTime:RFC3339
m,lbs,time
example,"1,280.7",2020-01-01T00:00:00Z
example,"1,352.5",2020-01-02T00:00:00Z
example,"1,862.8",2020-01-03T00:00:00Z
example,"2,014.9",2020-01-04T00:00:00Z
生成的 Line Protocol
example lbs=1280.7 1577836800000000000
example lbs=1352.5 1577923200000000000
example lbs=1862.8 1578009600000000000
example lbs=2014.9 1578096000000000000
带有非默认整数值的 CSV
#datatype measurement,"long:.,",dateTime:RFC3339
m,lbs,time
example,"1,280.0",2020-01-01T00:00:00Z
example,"1,352.0",2020-01-02T00:00:00Z
example,"1,862.0",2020-01-03T00:00:00Z
example,"2,014.9",2020-01-04T00:00:00Z
生成的 Line Protocol
example lbs=1280i 1577836800000000000
example lbs=1352i 1577923200000000000
example lbs=1862i 1578009600000000000
example lbs=2014i 1578096000000000000
带有非默认无符号整数值的 CSV
#datatype measurement,"unsignedLong:.,",dateTime:RFC3339
m,lbs,time
example,"1,280.0",2020-01-01T00:00:00Z
example,"1,352.0",2020-01-02T00:00:00Z
example,"1,862.0",2020-01-03T00:00:00Z
example,"2,014.9",2020-01-04T00:00:00Z
生成的 Line Protocol
example lbs=1280u 1577836800000000000
example lbs=1352u 1577923200000000000
example lbs=1862u 1578009600000000000
example lbs=2014u 1578096000000000000

使用备用布尔格式

Line protocol 仅支持特定的布尔值。如果您的 CSV 数据包含 line protocol 不支持的布尔值,请在 boolean 数据类型注解中定义您的布尔格式

带有非默认布尔值的 CSV
#datatype measurement,"boolean:y,Y,1:n,N,0",dateTime:RFC3339
m,verified,time
example,y,2020-01-01T00:00:00Z
example,n,2020-01-02T00:00:00Z
example,1,2020-01-03T00:00:00Z
example,N,2020-01-04T00:00:00Z
生成的 Line Protocol
example verified=true 1577836800000000000
example verified=false 1577923200000000000
example verified=true 1578009600000000000
example verified=false 1578096000000000000

使用不同的时间戳格式

当将 CSV 转换为 line protocol 时,influx write 命令会自动检测 RFC3339数字格式的时间戳。如果使用不同的时间戳格式,请在 dateTime 数据类型注解中定义您的时间戳格式

带有非默认时间戳的 CSV
#datatype measurement,dateTime:2006-01-02,field
m,time,lbs
example,2020-01-01,1280.7
example,2020-01-02,1352.5
example,2020-01-03,1862.8
example,2020-01-04,2014.9
生成的 Line Protocol
example lbs=1280.7 1577836800000000000
example lbs=1352.5 1577923200000000000
example lbs=1862.8 1578009600000000000
example lbs=2014.9 1578096000000000000

Flux

使用 csv.from()to() Flux 函数将 annotated CSV 写入您选择的 Bucket。

实验性的 csv.from() 函数允许您从 URL 写入 CSV。以下示例将 NOAA 水样本数据 写入示例组织中的示例 noaa Bucket

import "experimental/csv"

csv.from(url: "https://influx-testdata.s3.amazonaws.com/noaa.csv")
    |> to(bucket: "noaa", org: "example-org")

必需的注解和列

要使用 Flux 将 CSV 数据写入 InfluxDB,您必须包含所有以下注解和列

  • datatype
  • group
  • default

有关更多信息,请参阅 注解。使用 Flux 时,您还必须在注解名称和注解值之间包含逗号(这与 influx write 命令不同)。请参阅 Flux 中 annotated CSV 的有效语法示例。

必需的列

  • _time
  • _measurement
  • _field
  • _value

此页面是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像现在一样使用它,而无需对您的代码进行任何更改。

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、近实时数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、只读副本、增强的安全性以及数据压缩功能,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看