< Back
< Back

FlyData Autoload対応のデータ・フォーマット

FlyData Autoloadでは以下の4つのフォーマットをサポートしています。

本ドキュメントでは、FlyData Autoloadがサポートするこれらのフォーマットについて説明します。

なお、Herokuをご利用の場合は Flydata gem for Heroku を参照してください。

JSON

FlyData Autoloadは、JSONフォーマットのデータ取り込みをサポートしています。

FlyData Autoloadは、JSON形式のデータをもとに自動でテーブルを生成します。また、JSONデータに新たなKey-Valueが追加されると対応したカラムを動的に追加します。
JSONの動的カラム追加はFlyDataの機能の中でも特徴的なものです。これにより、フレキシブルにテーブルスキーマの操作を行うことができます。この機能はCSV、TSVフォーマットでは対応していません。動的カラム追加機能を利用する場合、JSONフォーマットをご利用ください。

JSONデータは以下のガイドラインに沿ったフォーマットである必要があります。

基本的なJSONフォーマット

FlyData AutoloadでJSONを利用するためには、FlyDataサイトでアカウント登録し、FlyDataサイトにログイン後、ダッシュボードページで、データエントリーの追加ボタンを行います。データエントリーのログ・フォーマットで JSON を選択してください。その他の必要入力項目(Redshiftのテーブル名とそれに対応するファイルパス)を入力し、データエントリーを新規作成してください。

{ "[column-name]": [column-value], … }

JSONデータは { ではじまり、改行コード \n で終わる必要があります。不正なフォーマットのJSONデータがあった場合、FlyData Autoloadはその行を処理しません。

ネストされたJSONフォーマット

FlyData Autoloadはネスト構造のJSONデータも取り込むことができます。ネスト構造とは、JSONの Value として、連想配列(ハッシュ)や配列をもつ構造です。

ネスト構造のValueを受け取ると、FlyData AutoloadはそのKeyをテーブル名の接尾語として利用します。そしてそのValueを通常のJSONのように処理します。たとえば、"users" テーブルに対応したJSONファイルが、"address" Keyに連想配列を持っていたとします。その場合、FlyData Autoloadは "users" テーブルの子テーブルとして "users_address" テーブルを生成します。

加えて、FlyData Autoloadは、テーブル間に親子関係を持たせるため、すべてのテーブルに`id`カラムを自動で追加します。
すでに`id`がkeyとして利用されていた場合は、FlyDataでは”親テーブル名_id”を作成し、親の”id”カラムの値と一致させます。

次の例は、"users"テーブルのデータとなるJSONデータです。このデータは2つのテーブル、"users""addresses"テーブルに格納されます。

// JSON Data
{
"name": "John",
"address": {
"city": "LA"
}
}

上記のJSONファイルは、下記のようにRedshiftに格納されます。

// 例1: Redshiftクラスタに格納されたデータ

// users (親テーブル)
-----------------
| name | id     |
+------+--------+
| John | 123456 |
-----------------

// users_address (子テーブル)
-------------------
| city | users_id |
+------+----------+
| LA   | 123456   |
-------------------

例1では、"address"のValueは連想配列となっています。連想配列でない配列の場合、処理は少し変わります。

配列は次のように処理されます。

  • index (配列のインデックス)
  • value(配列の値)
  • parent_id(親テーブルのid)

配列をValueにもつJSONデータ取り込みを、"gps_history"テーブルで説明します。

// 例2: ネストしたJSONデータ(配列)
{
"created_at": "2013-03-12 12:23:45",
"coordinates": [
121.01,
14.51
]
}

// 例2: Redshiftクラスタに格納されたデータ
// gps_history (親テーブル)
--------------------------------
|      created_at     |   id   |        
+---------------------+---------
| 2013-03-12 12:23:45 | 123456 |
--------------------------------

// gps_history_coordinates (子テーブル)
-----------------------------------
| index | value  | gps_history_id |
+-------+--------+----------------+
| 0     | 121.01 | 123456         |
+-------+--------+----------------+
| 1     | 14.51  | 123456         |
-----------------------------------

カラムのデータ型

FlyData Autoloadは読み込んだJSONファイルから下記のデータ型をもつカラムを生成します。

  • integer (4-byte)
  • big integer (8-byte)
  • float
  • boolean
  • varchar (256-byte)
  • date
  • timestamp

なお、カラムの動的追加は、追加されたKeyのValueが "null"、空のハッシュ、あるいは空の配列の場合には、スキップされます。

Date型とTimestamp型

FlyData Autoloadでは、Timstamp型あるいはDate型に対応する文字列をAmazon Redshiftがサポートする範囲でDate型に変換します。

サポートされるTimestamp型のとDate型は次を確認ください。

  • Date型
    YYYY/mm/dd  (ex 2012/05/25)
    YYYY-mm-dd  (ex 2013-04-12)
  • Timestamp型
    // W3C http://www.w3.org/TR/NOTE-datetime
    YYYY-MM-DDThh:mm:ssTZD (ex 1997-07-16T19:20:01+01:00)
    YYYY-MM-DDThh:mm:ss.sTZD (ex 1997-07-16T19:20.123+01:00)
    
    // Twitter
    ddd MMM dd HH:mm:ss zzzz yyyy (ex Sat Sep 17 14:48:57 +0000 2011)
    
    // Redshift
    YYYY-MM-DD hh:mm:ss (ex 2012-01-23 19:20:15)
    YYYY-MM-DD hh:mm:ss.s (ex 2012-01-23 19:20:15.243)
    
    // Apache
    [DD/MMM/YYYY:HH:mm:ss zzzz] (ex [13/Sep/2006:07:01:53 -0700])
    
    // Others
    YYYY-MM-DD hh:mm:ss zzzz (ex 2012-01-23 19:20:15 +0000)
    YYYY-MM-DD hh:mm:ss.s zzzz (ex 2012-01-23 19:20:15.243 +0000)

サポートされる文字列

3バイトまでのUTF-8に対応します。なお不正な文字は`?`に置換されます。

FlyData Consoleでの設定

FlyData Consoleの設定ページにて、下記オプションを設定できます。

  • 自動テーブル作成
    自動テーブル作成オプションがOffの状態で、Redshiftに対応するテーブルがない場合、データは無視されます。
  • 自動カラム追加
    “id”カラムと”parent_id”カラムがRedshiftテーブルに自動で付与されます。
    また、ネストされたJSONのサポートオプションがOnの場合、このオプションがOffであっても、”id”カラムと”parent_id”カラムは自動的に付与されます。
  • ネストされたJSONのサポート
    このオプションがOffである場合、配列や連想配列はシリアライズされたJSONテキストとして保存されます。

    CREATE TABLE your_tablename_here (
    an_integer INT,
    first_string VARCHAR255),
    second_string VARCHAR(255)
    );

CSV / TSV

FlyData Autoloadは、カンマ区切りやタブ区切りのデータ(CSV/TSV)もサポートします。

CSVやTSVの仕様はRFC 4180と少し異なりますがほぼ準じるものとなります。

  • FlyData Autoloadはダブルクォート(“)でフィールドをかこむこと、またカンマやタブ文字列をエスケープするためにダブルクォートを利用することはサポートしていません。
  • 次の文字を利用する場合はバックスラッシュでエスケープしてください。
    • , カンマ(CSVの場合のみ)
    • \t タブ(TSVの場合のみ)
    • \ バックスラッシュ
    • \n 改行

たとえば、改行コードを含むCSVファイルをアップロードする場合は下記のようにエスケープしてください。

01,john,29,Hello I'm John.\\nHow are you doing?

注意: CSVやTSVのデータフォーマットを利用する場合は、先にRedshift側にテーブルを作成しておく必要があります。

Apache Log Format

FlyData Autoloadは、Common Log Format (CLF) と Combined Log Format のApache Logをサポートします。

Apache logフォーマットを利用すると、データ転送前にRedshift側にテーブルを作成する必要はありません。

基本的なログ

Combined Log FormatのログデータがどのようにRedshiftに格納されるかの例です。

  • 例3:Apacheログ
    127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 
    2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
  • 例3:Redshiftに格納されたApacheログ
    // apache_access_log table
    ------------------------------------------------------
    | COLUMN         | ROW                               |
    +----------------+-----------------------------------+
    | ip             | 127.0.0.1                         |
    | remote_logname | -                                 |
    | remote_user    | frank                             |
    | timestamp      | 2000-10-10 13:55:36               |
    | http_method    | GET                               |
    | resource       | /apache_pb.gif                    |
    | protocol       | HTTP/1.0                          |
    | status         | 200                               |
    | size           | 2326                              |
    | referrer       | http://www.example.com/start.html |
    | user_agent     | Mozilla/4.08 [en] (Win98; I ;Nav) |
    ------------------------------------------------------

リクエストクエリパラメータ

上記の基本的なApacheログの取り込みに限らず、FlyData Autoloadではリクエストパラメータを格納させることが出来ます。
例えば、クエリパラメータとして ?user_id=123 とある場合、このパラメータに合致したカラムが自動で生成されます。

  • 例4:Apacheログ
    127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /purchase?user_id=293&item_id=201
    HTTP/1.0" 200 2326 "http://www.example.com/store.html" "Mozilla/4.08 [en] (Win98; I Nav)"
  • 例4:Redshiftに格納されたApacheログ
    // Apache_access_log table
    ------------------------------------------------------
    | COLUMN         | ROW                               |
    +----------------+-----------------------------------+
    | ip             | 127.0.0.1                         |
    | remote_logname | -                                 |
    | remote_user    | frank                             |
    | timestamp      | 2000-10-10 13:55:36               |
    | http_method    | GET                               |
    | resource       | /purchase?user_id=293&item_id=102 |
    | protocol       | HTTP/1.0                          |
    | status         | 200                               |
    | size           | 2326                              |
    | referrer       | http://www.example.com/store.html |
    | user_agent     | Mozilla/4.08 [en] (Win98; I ;Nav) |
    | user_id        | 293                               |
    | item_id        | 102                               |
    ------------------------------------------------------

FlyData拡張ログフォーマット

標準パラメータやリクエストパラメータでは対応出来ない場合は、FlyData拡張ログフォーマットが利用できます。

Common Log FormatやCombined Log Formatの終わりにダブルクオートでかこった文字列を追加してください。その場合、クエリパラメータのように&のあるkey=valueの形で記述します。

  • 例5:Apacheログ
    127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /purchase?user_id=293&item_id=201 
    HTTP/1.0" 200 2326 "http://www.example.com/store.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
    "session_id=rfnq17675gtrfejbtc46n0vi97&response_time=7"

    例5のApacheログデータの最後にダブルクォートで括られたもの、session_id や response_time がFlyData拡張ログフォーマットになります。FlyData Autoloadは、拡張ログフォーマット部分を確認すると、対応するカラムを自動生成し、Amazon Redshiftへデータを格納します。

  • 例5:Redshiftに格納されたApacheログ
    // Apache_access_log table
    ------------------------------------------------------
    | COLUMN         | ROW                               |
    +----------------+-----------------------------------+
    | ip             | 127.0.0.1                         |
    | remote_logname | -                                 |
    | remote_user    | frank                             |
    | timestamp      | 2000-10-10 13:55:36               |
    | http_method    | GET                               |
    | resource       | /purchase?user_id=293&item_id=102 |
    | protocol       | HTTP/1.0                          |
    | status         | 200                               |
    | size           | 2326                              |
    | referrer       | http://www.example.com/store.html |
    | user_agent     | Mozilla/4.08 [en] (Win98; I ;Nav) |
    | user_id        | 293                               |
    | item_id        | 102                               |
    | session_id     | rfnq17675gtrfejbtc46n0vi97        |
    | response_time  | 7                                 |
    ------------------------------------------------------