couchimport, CouchDB导入工具,允许数据被批量插入

分享于 

14分钟阅读

GitHub

  繁體
CouchDB import tool to allow data to be bulk inserted
  • 源代码名称:couchimport
  • 源代码网址:http://www.github.com/glynnbird/couchimport
  • couchimport源代码文档
  • couchimport源代码下载
  • Git URL:
    git://www.github.com/glynnbird/couchimport.git
    Git Clone代码到本地:
    git clone http://www.github.com/glynnbird/couchimport
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/glynnbird/couchimport
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    CouchImport

    Build Statusnpm version

    简介

    在填充CouchDB数据库时,数据的源通常是CSV或者TSV文件。 CouchImport旨在帮助你高效地将平面数据导入 CouchDB。 它可以用作命令行实用工具 couchimportcouchexport,也可以编程方式使用基础函数:

    • 只需在 命令行 上将数据文件导入'couchimport'
    • 处理选项卡或者逗号分隔的数据
    • 使用 node.js 流实现内存效率
    • 插入自定义函数以在写入数据之前添加你自己的更改
    • 将数据大容量写入以进行速度
    • 还可以使用流式JSON解析器编写大型JSON文件
    • 允许一次使用 --parallelism 选项进行多次写入

    schematic

    安装

    要求

    • node.js
    • npm
    
     sudo npm install -g couchimport
    
    
    
    

    配置

    可以将couchimport参数的配置存储在 环境变量 中,也可以作为 命令行 参数提供。

    :CouchDB的位置- 默认"http://localhost:5984"

    只需为托管的Cloudant数据库设置"couch_url"环境变量 比如

    
     export COUCH_URL="https://myusername:myPassw0rd@myhost.cloudant.com"
    
    
    
    
    

    或者本地CouchDB安装:

    
     export COUCH_URL="http://localhost:5984"
    
    
    
    

    数据库名称- 默认"测试""

    定义要写入的CouchDB数据库的名称,方法是设置"couch_database"环境变量 e.g.

    
     export COUCH_DATABASE="mydatabase"
    
    
    
    

    转换函数- 默认无

    定义包含转换函数 e.g.的文件的路径

    
     export COUCH_TRANSFORM="/home/myuser/transform.js"
    
    
    
    

    文件应:

    • 成为javascript文件
    • 如果需要将一行分成多个文档,导出一个接受单个文档的函数,返回单个对象或者对象的array。

    ( 参见示例目录) N.B 最好使用转换函数的完整路径。

    分隔符- 默认值""

    在输入数据 e.g. 中定义列分隔符

    
     export COUCH_DELIMITER=","
    
    
    
    

    运行

    将文本数据简单地传递到"couchimport":

    
     cat ~/test.tsv | couchimport
    
    
    
    

    本示例下载 public 犯罪数据,解压并导入它:

    
     curl 'http://data.octo.dc.gov/feeds/crime_incidents/archive/crime_incidents_2013_CSV.zip'> crime.zip
    
    
     unzip crime.zip
    
    
     export COUCH_DATABASE="crime_2013"
    
    
     export COUCH_DELIMITER=","
    
    
     ccurl -X PUT/crime_2013
    
    
     cat crime_incidents_2013_CSV.csv | couchimport
    
    
    
    

    在 上面 示例中,我们使用"( ccurl ) [ https://github.com/glynnbird/ccurl]"使用相同 环境变量的命令行实用工具"couchimport"。

    输出

    当"couchimport"运行时,控制台上会显示以下输出:

    
    ******************
    
    
     COUCHIMPORT - configuration
    
    
     {"COUCH_URL":"https://****:****@myhost.cloudant.com","COUCH_DATABASE":"aaa","COUCH_TRANSFORM":null,"COUCH_DELIMITER":","}
    
    
    ******************
    
    
    Written 500 ( 500 )
    
    
    Written 500 ( 1000 )
    
    
    Written 500 ( 1500 )
    
    
    Written 500 ( 2000 )
    
    
    .
    
    
    .
    
    
    
    
    

    无论是默认的还是由 环境变量 或者 命令行 参数覆盖的配置,都会显示。 这后面是编写了 500个文档的每个 block的一行输出,加上累积的总数。

    预览模式

    如果要查看将从 csv/ptr文件创建的JSON的预览,然后将 --preview true 添加到命令行:

    
    > cat text.txt | couchimport --preview true
    
    
     Detected a TAB column delimiter
    
    
     { product_id: '1',
    
    
     brand: 'Gibson',
    
    
     type: 'Electric',
    
    
     range: 'ES 330',
    
    
     sold: 'FALSE' }
    
    
    
    

    除了显示JSON预览,预览模式还试图检测你的列分隔符字符。

    导入大型JSON文档

    如果源文档是GeoJSON文本文件,则可以使用 couchimport。 假设你的JSON如下所示:

    
    {"features": [ {"a":1}, {"a":2}] }
    
    
    
    

    我们需要将每个特性对象作为单独的文档导入 CouchDB,然后使用 type="json" 参数导入:并使用 json-path 参数

    
     cat myfile.json | couchimport --database mydb --type json --jsonpath"features.*"
    
    
    
    

    导入JSON行文件

    如果源文档是行文本文件,则可以使用 couchimport。 假设你的JSON线条如下所示:

    
    {"a":1}
    
    
    {"a":2}
    
    
    {"a":3}
    
    
    {"a":4}
    
    
    {"a":5}
    
    
    {"a":6}
    
    
    {"a":7}
    
    
    {"a":8}
    
    
    {"a":9}
    
    
    
    

    我们需要将每一行作为一个JSON对象导入CouchDB作为单独的文档,然后可以使用 type="jsonl" 参数导入它:

    
     cat myfile.json | couchimport --database mydb --type jsonl
    
    
    
    

    导入JSONs流

    如果源数据是多个JSON对象嵌入或者追加在一起,则可以使用 couchimport。 假设你的file:

    
    {"a":1}{"a":2} {"a":3}{"a":4}
    
    
    {"a":5} {"a":6}
    
    
    {"a":7}{"a":8}
    
    
    
    {"a":9}
    
    
    
    

    我们需要将每个 JSON objet作为单独文档导入 CouchDB,然后可以使用 type="jsonl" 参数导入它们:

    
     cat myfile.json.blob | couchimport --database mydb --type jsonl
    
    
    
    

    环境变量

    • COUCH_URL - CouchDB实例( 必需,或者在 命令行 上提供)的url
    • COUCH_DATABASE - 要处理的数据库( 需要或者在 命令行 上提供)
    • COUCH_DELIMITER - 要使用( 默认值' t的分隔符,不需要
    • COUCH_TRANSFORM - 转换函数的路径( 不需要)
    • COUCHIMPORT_META - 将传递给转换函数的json对象( 不需要)
    • COUCH_BUFFER_SIZE - 每批写入写入CouchDB的记录数( 默认为 500,不需要)
    • COUCH_FILETYPE - 要导入的文件类型,"文本","json"或者"jsonl"( 默认为"文本",不需要)
    • COUCH_JSON_PATH - 入口JSON文档的路径( 仅适用于COUCH_FILETYPE=json导入)
    • COUCH_PREVIEW - 在预览模式下运行
    • COUCH_IGNORE_FIELDS - 在导入或者导出 比如 价格,url,图像时忽略的字段名称的逗号分隔列表

    命令行命令行参数

    你还可以使用命令行参数配置 couchimportcouchexport:

    • --version --只输出版本和退出
    • --url - CouchDB实例( 必需,或者在环境中提供)的url
    • --database ( 或者 --db ) - 处理( 需要,或者在环境中提供)的数据库
    • --delimiter - 要使用( 默认值' t的分隔符,不需要
    • --transform - 转换函数的路径( 不需要)
    • --meta - 将传递给转换函数的json对象( 不需要)
    • --buffer - 每批写入写入CouchDB的记录数( 默认为 500,不需要)
    • --type - 要导入的文件类型,"文本","json"或者"jsonl"( 默认为"文本",不需要)
    • --json-path - 入口JSON文档的路径( 仅适用于type=json导入)
    • --preview - 如果'true',则在预览模式下运行
    • --ignorefields --要忽略输入或者输出的字段的逗号分隔列表

    : )

    
     cat test.csv | couchimport --database bob --delimiter","
    
    
    
    

    couchexport

    如果在CouchDB或者Cloudant中具有固定键和值 e.g.的结构化数据

    
    {
    
    
    "_id":"badger",
    
    
    "_rev":"5-a9283409e3253a0f3e07713f42cd4d40",
    
    
    "wiki_page":"http://en.wikipedia.org/wiki/Badger",
    
    
    "min_weight": 7,
    
    
    "max_weight": 30,
    
    
    "min_length": 0.6,
    
    
    "max_length": 0.9,
    
    
    "latin_name":"Meles meles",
    
    
    "class":"mammal",
    
    
    "diet":"omnivore",
    
    
    "a": true
    
    
    }
    
    
    
    

    然后,它可以像( 请注意我们如何设置分隔符) 那样导出到一个 CSV:

    
     couchexport --url http://localhost:5984 --database animaldb --delimiter","> test.csv
    
    
    
    

    或者类似于(。我们不需要指定分隔符,因为标签 t 是缺省的) 这样的TSV:

    
     couchexport --url http://localhost:5984 --database animaldb> test.tsv
    
    
    
    

    注意,

    • 忽略设计文档
    • 第一个非设计的文件用来定义标题。
    • 如果后续文档有不同的键,则可能会发生意外的事情
    • 可以使用COUCH_DELIMITER或者--delimiter提供自定义列分隔符( 当制表符分隔时不需要)
    • 如果文档值包含回车或者列分隔符,那么这可能不是你的工具

    以编程方式使用

    在项目中,将 couchimport 添加到 package.json的依赖项中或者运行 npm install couchimport。 在你的代码中,需要使用

    
     var couchimport = require('couchimport');
    
    
    
    

    你的选项在它的密钥与 COUCH_* 环境变量 相同的对象中设置:

    : )

    
     var opts = { COUCH_DELIMITER:",", COUCH_URL:"http://localhost:5984", COUCH_DATABASE:"mydb" };
    
    
    
    

    要从可以读流( rs ) 导入数据,请执行以下操作:

    
     var rs = process.stdin;
    
    
     couchimport.importStream(rs, opts, function(err,data) {
    
    
     console.log("done");
    
    
     });
    
    
    
    

    从命名的file: 导入数据

    
     couchimport.importFile("input.txt", opts, function(err,data) {
    
    
     console.log("done",err,data);
    
    
     });
    
    
    
    

    要将数据导出到可以写流( ws ),请执行以下操作:

    
     var ws = process.stdout;
    
    
     couchimport.exportStream(ws, opts, function(err, data) {
    
    
     console.log("done",err,data);
    
    
     });
    
    
    
    

    将数据导出到命名的file:

    
     couchimport.exportFile("output.txt", opts, function(err, data) {
    
    
     console.log("done",err,data);
    
    
     });
    
    
    
    

    预览 file:

    
     couchimport.previewCSVFile('./hp.csv', opts, function(err, data, delimiter) {
    
    
     console.log("done", err, data, delimiter);
    
    
     });
    
    
    
    

    若要在URL上预览 csv/tsv:

    
     couchimport.previewURL('https://myhosting.com/hp.csv', opts, function(err, data) {
    
    
     console.log("done", err, data, delimiter); 
    
    
     });
    
    
    
    

    监视导入

    importStreamimportFile 都返回一个 EventEmitter,它发出

    • 成功写入时的written 事件
    • 当完成写操作失败时的writeerror 事件
    • 最后一次写入后的writecomplete 事件已经完成
    • 当CSV中的单个行无法作为文档保存时的writefail 事件

    : )

    
    couchimport.importFile("input.txt", opts, function(err,data) {
    
    
     console.log("done",err,data);
    
    
    }).on("written", function(data) {
    
    
    //data = { documents: 500, failed:6, total: 63000, totalfailed: 42}
    
    
    });
    
    
    
    

    所发出的数据是包含以下内容的对象:

    • 文档- 上次批处理中写入的文档数
    • total - 到目前为止写入的文档总数
    • 失败- 上次批处理中写入的文档数失败
    • totalfailed - 未写入总数的文档数

    并行

    可以使用 COUCH_PARALLELISM 环境变量或者 --parallelism 命令行选项,将couchimport配置为在多个并行操作中写入数据。 如果你拥有 networkbandwidth,这可以显著加快大型数据导入 e.g.的速度

    
     cat bigdata.csv | couchimport --database mydb --parallelism 10 --delimiter","
    
    
    
    

    数据  tool  IMP  导入  插入  Couchdb  
    相关文章