ターミナルからTreasureDataにcsvファイルをアップロードする方法

Docker

はじめに

今までビックデータを扱う仕事をしてきたのにTreasure Dataを触ったことがありませんでした。
csvファイルをアップロードするだけでも悩んでしまいました。

検証環境

$ uname -moi
x86_64 MacBookPro10,1 Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.0.11(1)-release (x86_64-apple-darwin18.6.0)

アップロードの手順について

以下のサイトが参考になりました。
Embulkを使ってデータをインポートする方法です。

データのインポートのためにいくつか準備しないといけないようですので、順番に設定していきます。

1.Embulkのインストール

パット見た感じ、JRE 1.8が必要であり、セットアップが面相くさそうでした。

せっかくなのでDockerイメージを作成して公開してみました。

したがって、以下のDockerイメージを利用していただければインストールを省略できます。次へ進みましょう。

genzouw/embulk-output-td

Docker Cloud build status
Docker Pulls
Docker Cloud Automated build

dockeri.co

2.seed構成ファイルを作成

Treasure Dataへデータをインポートするための設定ファイルは、"seed configuration file"と呼ばれるファイルから自動生成させることができます。

まずは"seed configuration file"を作成します。

in:
    type: file
    path_prefix: /workdir/your_data.csv
out:
    type: td
    apikey: **************your_td_apk_key****************
    endpoint: api.treasuredata.com
    database: your_db_name
    table: your_table_name
    mode: replace
    default_timestamp_format: '%Y-%m-%d %H:%M:%S'

seed.ymlの細かい設定についてはここでは取り上げません。

  • apikey の部分はTreasure Dataの設定ページから取得してください。
  • database / table についても自分のデータベース名、テーブル名を設定しましょう。
  • path_prefix については、Dockerコンテナ内のパスを指定しなければならない点に注意しましょう。(後述)

アップロードするcsvファイルも適当に作っておきましょう。

cat <<EOF > ./your_data.csv
a1,b2,c3,d4,e5,f6
1,2,3,4,5,6
2,3,4,5,6,7
EOF

3.load.ymlの生成

seed.ymlからload.ymlを生成します。

# アップロードしたいファイル、seed.ymlがカレントディレクトリに存在していることを確認
$ ls your_data.csv seed.yml
your_data.csv  seed.yml

# Dockerイメージを使ってload.ymlを生成
$ docker run --rm -i -t \
    -v $PWD:/workdir \
    --workdir /workdir \
    genzouw/embulk-output-td guess seed.yml -o load.yml

4. ロードジョブの実行

load.ymlは実行ジョブが設定されているファイルとなっています。
これを使って、アップロードジョブを実行しましょう。

# アップロードしたいファイル、load.ymlがカレントディレクトリに存在していることを確認
$ ls your_data.csv load.yml
your_data.csv  load.yml

# Dockerイメージを使ってload.yml設定を使ってデータをロード
$ docker run --rm -i -t \
    -v $PWD:/workdir \
    --workdir /workdir \
    genzouw/embulk-output-td run load.yml

この状態でTreasure Dataのデータを確認すれば、データがインポートされているはずです。

ひとこと

コマンドラインからデータロードさせるための仕組みもできました。

Docker