Documentation

将CSV数据写入InfluxDB

使用以下方法写入CSV数据:

influx 写入命令

使用influx write命令将CSV数据写入InfluxDB。包含扩展注释CSV标注以指定数据如何转换为行协议。在CSV文件中包含注释或使用--header标志注入它们,方法是使用influx write命令。

在此页面上
示例写入命令
influx write -b example-bucket -f path/to/example.csv
示例.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
生成的行协议
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到行协议的转换过程,请使用 influx write dryrun 命令将结果行协议打印到标准输出,而不是写入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 列代表行协议的哪个元素以及如何格式化数据。CSV 注释是 CSV 文件开头的行,用于描述列属性。

influx write 命令支持 扩展注释 CSV,提供了指定如何将 CSV 数据转换为线协议以及数据格式化选项。

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

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

将原始查询结果写回到InfluxDB

Flux 返回查询结果为 带注释的 CSV
这些结果包含将数据写回 InfluxDB 所需的所有注释。

注入注解头

如果您想写入InfluxDB的CSV数据不包含正确转换数据为行协议所需的注释,请使用 --header 标志将注释行注入CSV数据中。

influx write -b example-bucket \
  -f path/to/example.csv \
  --header "#constant measurement,birds" \
  --header "#datatype dateTime:2006-01-02,long,tag"
示例.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
生成的行协议
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 命令支持在单个命令中导入多个文件。 将注释和标题行放在自己的文件中,并使用写入命令导入它们。 文件按提供的顺序读取。

influx write -b example-bucket \
  -f path/to/headers.csv \
  -f path/to/example.csv
头文件.csv
#constant measurement,birds
#datatype dateTime:2006-01-02,long,tag
示例.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
生成的行协议
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所需的注释冲突或缺失的标题行。使用 --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

influx write 命令假设所有输入文件都是行协议,除非它们包含 .csv 扩展名或您声明 csv

指定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

高级示例


定义常量

使用扩展注释的 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
生成的行协议
example,source=csv count=1 1577836800000000000
example,source=csv count=4 1577923200000000000
example,source=csv count=9 1578009600000000000
example,source=csv count=18 1578096000000000000

注释简写

扩展注释的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
生成的行协议
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
生成的行协议
example count=1i 1577836800000000000
example count=4i 1577923200000000000
example count=0i 1578009600000000000
example count=18i 1578096000000000000

忽略列

使用扩展的注释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
生成的行协议
m count=1i 1577836800000000000
m count=4i 1577923200000000000
m count=9i 1578009600000000000
m count=18i 1578096000000000000

使用替代数字格式

如果您的CSV数据包含使用非默认分隔符的数值(.)或包含分组分隔符,定义您的数值格式double, longunsignedLong 数据类型注释中。

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

具有非默认浮动值的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
生成的行协议
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
生成的行协议
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
生成的行协议
example lbs=1280u 1577836800000000000
example lbs=1352u 1577923200000000000
example lbs=1862u 1578009600000000000
example lbs=2014u 1578096000000000000

使用替代布尔格式

行协议仅支持 特定的布尔值。如果您的CSV数据包含行协议不支持的布尔值,定义您的布尔格式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
生成的行协议
example verified=true 1577836800000000000
example verified=false 1577923200000000000
example verified=true 1578009600000000000
example verified=false 1578096000000000000

使用不同的时间戳格式

当将CSV转换为线协议时,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
生成的行协议
example lbs=1280.7 1577836800000000000
example lbs=1352.5 1577923200000000000
example lbs=1862.8 1578009600000000000
example lbs=2014.9 1578096000000000000

通量

使用 csv.from()to() Flux 函数将带注释的 CSV 写入您选择的 bucket。

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

import "experimental/csv"

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

必需的注释和列

要将CSV数据写入InfluxDB,您必须包含所有以下注释和列:

  • datatype
  • group
  • default

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

必填列:

  • _time
  • _measurement
  • _field
  • _value


Flux的未来

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

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看: