駄文型

プログラミングとか英語とかの話題を中心にした至極ちゃらんぽらんな日記です。

Node.jsアプリケーションからトレジャーデータサービス by IDCFにデータをエクスポートする

トレジャーデータサービス by IDCFとは

www.idcf.jp

IDCフロンティアが提供しているデータの収集・蓄積・分析を行うビッグデータ分析プラットフォームで、「Yahoo!ビッグデータインサイト」だったものがサービス名変更になったもの。

参考

APIキーの取得

TDにエクスポートするにはAPIキーというものが必要で、 Webコンソールから取得するか、Tresure Data toolbeltをインストールして$ td apikeyで取得する。取得したAPIキーは環境変数に入れておくことにする。

$ export TREASURE_DATA_API_KEY=`APIキー`

Node.jsアプリ

$ npm install --save tdでインストールして実行。

const express = require('express');
const app = express();

const TD = require('td');
const client = new TD(
  process.env.TREASURE_DATA_API_KEY,
  { host: 'api.ybi.idcfcloud.net' }
);

const logger = function (err, results) {
  console.log(results);
  if (err) console.log(err);
};

app.post('/', upload.single('data'), (req, res) => {

  client.prestoQuery(
    'db_name',
    'INSERT INTO table_name (c1,c2,c3) VALUES (v1,v2,v3),(v4,v5,v6)',
    {},
    logger
  );

  res.end('success');
});

app.listen(4000, function () {
  console.log('Example app listening on port 4000!');
});

重要なのがオプションでホストを指定しておく必要がある点。これをやっておかないと デフォルトでapi.treasuredata.comが指定されるらしいので、トレジャーデータサービス by IDCFを使うなら必ずapi.ybi.idcfcloud.netにしておかないといけない。ドキュメントにも書いてないので、なかなかわからなかった。つらい。また、URLは旧サービス名のままなので、そのうち変わるかもしれない。

ファイルをcurlでアップロードしてNode.jsで受け取る

なかなかうまく行かなくて半日かかったのでまとめておく。

参考

Node.jsアプリ

まずはmulterを入れてNode.jsアプリを構築。

$ npm install --save multer
var express = require('express');
var multer  = require('multer');
var upload = multer({ dest: 'uploads/' });
var app = express();

app.post('/', upload.single('data'), function (req, res) {
  console.log(req.file);
  res.end('success');
});

app.listen(4000, function () {
  console.log('Example app listening on port 4000!');
});

curlコマンドでテスト

ローカルでテストする場合はlocalhostcurlでPOSTを投げるだけ。

$ curl "localhost:4000" -X POST -F data=@test/test.csv

今回はtest/test.csvを用意した。jsonでもなんでもいい。

column0,column1,column2,column3
1,2,3,4
a,b,c,d

結果

{ fieldname: 'data',
  originalname: 'test.csv',
  encoding: '7bit',
  mimetype: 'application/octet-stream',
  destination: 'uploads/',
  filename: 'de080535f6452289e8b896236c0d179d',
  path: 'uploads/de080535f6452289e8b896236c0d179d',
  size: 49 }

uploadディレクトリにファイルが作成された。uploadディレクトリは勝手に作成されるっぽい。req.fileのところでreq.bodyreq.filesを指定してたのでずっと{}とだけ表示されてかなりハマってしまった。README見たらちゃんと.singleのときはreq.fileって書いてあった。つらい。