将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时定义列数据类型和默认值。
要用注释简写替换现有的列标题行:
- 使用
--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
生成的行协议
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, 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
生成的行协议
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,您必须包含所有以下注释和列:
datatypegroupdefault
有关更多信息,请参见 注释。
在 Flux 中,您还必须在注释名称和注释值之间包含一个逗号(这与 influx write 命令不同)。
请参见 Flux 中的注释 CSV 的有效语法示例。
必填列:
_time_measurement_field_value