如何使用 python 客户端将大量行从 InfluxDB 导出到 CSV?

Posted

技术标签:

【中文标题】如何使用 python 客户端将大量行从 InfluxDB 导出到 CSV?【英文标题】:How to export large number of rows from InfluxDB to CSV using python client? 【发布时间】:2018-06-14 14:00:07 【问题描述】:

我正在尝试将大量行 (160.000.000+) 从 influxDB 导出到 csv 文件。到目前为止,我只是在运行查询的机器上炸毁内存。我不知道如何在不破坏运行导出的机器的内存的情况下导出这么多行。对此有什么想法吗??我也尝试过 CLI,但没有任何运气。

我试过下面的代码..

def export_to_csv_file(self, file_name, header, query):
    logger.info("Executing query ".format(query))
    dfs = pd.DataFrame(self.client.query(query, chunked=True, chunk_size=10000).get_points())
    dfs.to_csv('dummy.txt', index=False, columns=header, encoding='utf-8')

关于如何成功导出数据的任何提示或技巧。

【问题讨论】:

使用一系列调用,每个调用都将一个新的行集合附加到输出文件中。 【参考方案1】:

这可以通过 influx_inspect CLI 工具 + 一些 bash/grep/tr/cut 后处理来完成。从 InfluxDB v1.2.4 导出 >300M 行时,它对我有用,没有内存问题。

关键是使用 influx_inspect - 像 influx -database 'metrics' -execute 'select * from cpu' -format 'csv' 这样的命令惨遭失败。

这样的脚本将使用 influx lineprotocol 格式的数据创建文件:

#!/bin/bash
month=2017-04

db=YOUR_DBNAME
rp=autogen
datadir=/data/influxdb/data
waldir=/data/influxdb/wal
outdir=/somepath/influx_export

for d in 01..9 10 ; do
    echo $(date) Running time influx_inspect export -database $db -retention $rp -datadir $datadir -waldir $waldir -compress -start $month-$dT00:00:00Z -end $month-$dT23:59:59Z -out $outdir/export.$month-$d.lineproto.gz
    time influx_inspect export -database $db -retention $rp -datadir $datadir -waldir $waldir -compress -start $month-$dT00:00:00Z -end $month-$dT23:59:59Z -out $outdir/export.$month-$d.lineproto.gz
    echo $(date) Done
done

然后这些 lineproto 文件可以通过后处理步骤转换为 CSV。

在我的情况下,输出文件中的数据行如下所示:

# some header lines then data lines:
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=87 packets=1030000i 1488358500000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=87 packets=2430000i 1488358800000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=875 bytes=400000i 1488355200000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=875 bytes=400000i 1488356400000000000
device_interfaces,device=10.99.0.6,iface_in=998,iface_out=875 packets=10000i 1488355200000000000

这里的坏处是测量的数据字段以单独的行和随机顺序出现。

在我的例子中,转换脚本只是将每个测量数据字段(数据包和字节)放入一个单独的 CSV 文件中(我稍后将它们加入数据库中)。您可能需要自定义或编写自己的。

MEASUREMENT=YOUR_MEASUREMENT_NAME
for file in *lineproto.gz ; do
   echo -e "--- $(date) Processing file $file ...."

    for field in packets bytes ; do
       # uncompress, strip some header lines, delete junk chars and measurement name, replace spaces with comma
       gzip -dc $file | grep "$MEASUREMENT,device" | grep $field | tr -d a-zA-Z_=- | tr -s ' ' , | cut -b1 --complement >> field_$field.csv
       echo -e "Conversion for $db field $field done"
    done
    echo -e "--- File $file processed at $(date)"
done

【讨论】:

以上是关于如何使用 python 客户端将大量行从 InfluxDB 导出到 CSV?的主要内容,如果未能解决你的问题,请参考以下文章

将 1100 万行从 Postgresql 导入到 Pandas/Python

如何仅将选定的行从handsontable导出到csv

如何将最新的 100 行从 Hbase 加载到 Spark

如何使用 Excel VBA 将特定行从多个工作表复制到另一个工作表?

zipfile 将最后几行从我的文件中删除 - 为啥?

如何将行从另一个数据库文件插入到房间数据库中?