[Talend] センシティブな情報を隠蔽する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

センシティブな情報の隠蔽

Talend を用いたデータ統合の際の要件として、「個人情報のようなセンシティブなデータを隠蔽する」というものがあったので、「tFilterColumns」コンポーネントと「tJavaRow」コンポーネントによる方法を試してみました。

tFilterColumns

「変換処理」に用意されている「tFilterColumns」を利用して、含めたくないデータのカラム自体を除去します。

処理の流れ

  1. tMysqlInput: user テーブルから 1 万件のユーザ情報を取得する。
  2. tFilterColumns: 含めたくないデータのカラムを除去する。
  3. tLogRow: 結果をコンソールに表示する。
WS000000

tFilterColumn の設定

  1. 「カラムの同期」ボタンを押下して user テーブルと同期する。
  2. 「スキーマの編集」ボタンを押下する。
    WS000001
  3. 隠蔽するカラムを tFilterColumns_1 (Output) 側から除去する。
    WS000002
    WS000003
  4. tFilterColumn の出力に合わせる為、tLogRow のコンポーネント設定で「カラムの同期」ボタンを押下する。

結果

コンソールへの出力は以下のようになります。

.-----+---------+----------+-------------.
|               tLogRow_1                |
|=----+---------+----------+------------=|
|id   |gender_id|birth_date|prefecture_id|
|=----+---------+----------+------------=|
|1    |1        |01-08-2014|1            |
|2    |1        |01-08-2014|1            |
|3    |1        |01-08-2014|1            |
|4    |1        |01-08-2014|1            |
|5    |1        |01-08-2014|1            |
|6    |1        |01-08-2014|1            |
|7    |1        |01-08-2014|1            |
|8    |1        |01-08-2014|1            |
|9    |1        |01-08-2014|1            |
                   :

実行に掛かった時間は以下の通りです。

WS000004
WS000005
WS000006

三回の平均時間(row2)は、0.76 秒でした。

tJavaRow

要件によってはテーブルの構造を変えたくない(カラムを削除したくない)というケースもあるかと思います。そのような場合は、「tJavaRow」を使用して隠蔽したいカラムのデータを特定の値で置き換えてしまいます。

処理の流れ

  1. tMysqlInput: user テーブルから 1 万件のユーザ情報を取得する。
  2. tJavaRow: 隠蔽したいカラムのデータを特定の値で上書きする。
  3. tLogRow: 結果をコンソールに表示する。
WS000007

tJavaRow の設定

  1. 「カラムの同期」ボタンを押下して user テーブルと同期する。
  2. 「コードの生成」ボタンを押下してカラムの入出力コードを生成する。
    //入力スキーマと出力スキーマに従って生成されたコード
    output_row.id = input_row.id;
    output_row.password = input_row.password;
    output_row.last_name = input_row.last_name;
    output_row.first_name = input_row.first_name;
    output_row.last_kana = input_row.last_kana;
    output_row.first_kana = input_row.first_kana;
    output_row.gender_id = input_row.gender_id;
    output_row.birth_date = input_row.birth_date;
    output_row.mail_address = input_row.mail_address;
    output_row.phone_mail_address = input_row.phone_mail_address;
    output_row.zip_number = input_row.zip_number;
    output_row.prefecture_id = input_row.prefecture_id;
    output_row.address1 = input_row.address1;
    output_row.address2 = input_row.address2;
    
  3. 隠蔽するカラムの入力値を特定の値へ変更する。
    //入力スキーマと出力スキーマに従って生成されたコード
    output_row.id = input_row.id;
    output_row.password = "#### Masked! ####";
    output_row.last_name = "#### Masked! ####";
    output_row.first_name = "#### Masked! ####";
    output_row.last_kana = "#### Masked! ####";
    output_row.first_kana = "#### Masked! ####";
    output_row.gender_id = input_row.gender_id;
    output_row.birth_date = input_row.birth_date;
    output_row.mail_address = "#### Masked! ####";
    output_row.phone_mail_address = "#### Masked! ####";
    output_row.zip_number = "#### Masked! ####";
    output_row.prefecture_id = input_row.prefecture_id;
    output_row.address1 = "#### Masked! ####";
    output_row.address2 = "#### Masked! ####";
    
  4. tLogRow コンポーネントのスキーマを同期していない場合は、その設定にある「カラムの同期」ボタンを押下する。

結果

コンソールへの出力は以下のようになります。

.-----+-----------------+-----------------+-----------------+-----------------+-----------------+---------+----------+-----------------+------------------+-----------------+-------------+-----------------+-----------------.
|                                                                                                          tLogRow_1                                                                                                          |
|=----+-----------------+-----------------+-----------------+-----------------+-----------------+---------+----------+-----------------+------------------+-----------------+-------------+-----------------+----------------=|
|id   |password         |last_name        |first_name       |last_kana        |first_kana       |gender_id|birth_date|mail_address     |phone_mail_address|zip_number       |prefecture_id|address1         |address2         |
|=----+-----------------+-----------------+-----------------+-----------------+-----------------+---------+----------+-----------------+------------------+-----------------+-------------+-----------------+----------------=|
|1    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|2    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|3    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|4    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|5    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|6    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|7    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|8    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
|9    |#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|#### Masked! ####|1        |01-08-2014|#### Masked! ####|#### Masked! #### |#### Masked! ####|1            |#### Masked! ####|#### Masked! ####|
                                                                                                              :

実行に掛かった時間は以下の通りです。

WS000008
WS000009
WS000010

三回の平均時間(row2)は、1.45 秒でした。

まとめ

出力に掛かった時間は三回の平均値なので誤差はあるかと思いますが、カラム自体を除去する「tFilterColumns」コンポーネントの方がいくらかパフォーマンスに優れているように感じられました。Talend のジョブは全て Java コードに変換されますが、そもそも入力値を出力へ渡す処理が必要ない分、tFilterColumns の方が速かったのでしょう。 「tJavaRow」コンポーネントについては、特定の値だけでなく加工したデータを出力値として設定できるので、データ隠蔽以外にも様々な利用ケースが考えられますね。
他にもデータの隠蔽に使えそうなコンポーネントがあったら試してみたいと思います。