将 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,数据必须包含以下内容
- measurement(测量)
- field set(字段集)
- timestamp (可选但推荐)
- tag set (可选)
使用 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 时定义列数据类型和默认值。
要用注解简写替换现有的列标头行
- 使用
--skipHeader
标志忽略现有的列标头行。 - 使用
--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 数据包含使用非默认小数分隔符 (.
) 或包含分组分隔符的数值,请在 double
、long
和 unsignedLong
数据类型注解中定义您的数字格式。
如果您的数字格式分隔符包含逗号 (,
),请将列注解用双引号 (""
) 括起来,以防止逗号被解析为列分隔符或定界符。您还可以定义自定义列分隔符。
带有非默认浮点数值的 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
此页面是否对您有帮助?
感谢您的反馈!