# Explode_json_columns出力フィルター関数

Treasure Data統合用のexplode_json_columnsオプションは、JSONを持つカラムを複数のカラムに展開します。

## 設定

以下の例に示すように、out:セクションにexplode_json_columnsオプションとJSONカラム名を追加します：

```yaml
in:
...
out:
  explode_json_columns: ["json_column"]
...
```

展開するように設定されていても、元のJSONカラム名は結果に残ります。

JSONデータに別のカラムと重複する名前がある場合は、renameフィルターを使用する必要があります。この記事のユースケース4を参照してください。

## ユースケース1：1つのJSONカラムを展開

JSONカラムを含むcsvデータがある場合、データコネクタの.ymlファイルに項目を追加します。

例えば、ソースデータが以下の場合：

```bash
id  jsons
1   {"time2":1455829282,"ip":"93.184.216.34","name":"frsyuki"}
2   {"time2":1455829282,"ip":"172.36.8.109","name":"sadayuki"}
3   {"time2":1455829284,"ip":"example.com","name":"Treasure Data"}
4   {"time2":1455829282,"ip":"10.98.43.1","name":"MessagePack"}
```

.ymlファイルに以下を追加します。この場合、データコネクタはjsonsカラムを展開します。

```yaml
out:
  explode_json_columns: ["jsons"]
  mode: append
```

結果は以下のようになります：

![](/assets/image-20191212-173949.cad64529db08dce6228577422b4475590085307740ba7a83229a97c8638c3f5a.b2039cd8.png)

## ユースケース2：複数のJSONカラムを展開

複数のJSONカラムを含むcsvデータがある場合、展開するカラム名を設定します。

例えば、ソースデータが以下の場合：

```bash
id  jsons   jsons2
1   {"time2":1455829282,"ip":"93.184.216.34","name":"frsyuki"}  {"country":"Japan","language":"Japanese"}
2   {"time2":1455829282,"ip":"172.36.8.109","name":"sadayuki"}  {"country":"USA","language":"English"}
3   {"time2":1455829284,"ip":"example.com","name":"Treasure Data"}  {"country":"Brazil","language":"Portuguese"}
4   {"time2":1455829282,"ip":"10.98.43.1","name":"MessagePack"} {"country":"Spain","language":"Spanish"}
```

.ymlファイルに以下を追加します。この場合、Data Connectorはjsonsカラムを展開します。

```yaml
out:
  explode_json_columns: ["jsons","jsons2"]
  mode: append
```

結果は以下のようになります：

![](/assets/image-20191212-173908.f61a1821ff988761fdeefaa5041ba047544e9ac47720158ff1cb5f2e6067ee0d.b2039cd8.png)

## ユースケース3：JSONデータファイル

ソースデータのデータ型がJSONの場合、カラム名をrecordとして展開を設定します。

例えば、ソースデータが以下の場合：

```jsonl
{"time2":1455829282,"ip":"93.184.216.34","name":"frsyuki"}
{"time2":1455829282,"ip":"172.36.8.109","name":"sadayuki"}
{"time2":1455829284,"ip":"example.com","name":"Treasure Data"}
{"time2":1455829282,"ip":"10.98.43.1","name":"MessagePack"}
```

.ymlファイルに以下を追加します。この場合、Data ConnectorはJSONデータを展開します。

```yaml
out:
  explode_json_columns: ["record"]
  mode: append
```

結果は以下のようになります：

![](/assets/image-20191212-173908.f61a1821ff988761fdeefaa5041ba047544e9ac47720158ff1cb5f2e6067ee0d.b2039cd8.png)

## ユースケース4：重複カラム名、1カラムの展開

JSONデータに別のカラムと重複する名前がある場合は、renameフィルターオプションを使用します。詳細は[add_timeフィルタープラグイン](/ja/products/customer-data-platform/integration-hub/batch/import/filter/add_time-filter-function)を参照してください。サンプルの場合、jsonsにはcsvのnameカラムと同じnameキーがあります。

例えば、ソースデータが以下の場合：

```
name    jsons
A   {"time2":1455829282,"ip":"93.184.216.34","name":"frsyuki"}
B   {"time2":1455829282,"ip":"172.36.8.109","name":"sadayuki"}
C   {"time2":1455829284,"ip":"example.com","name":"Treasure Data"}
D   {"time2":1455829282,"ip":"10.98.43.1","name":"MessagePack"}
```

.ymlファイルのfilterセクションにrenameオプションを追加します。この場合、Data Connectorはjsonsデータを展開できます。

```yaml
in:
...
filters:
  - type: rename
    columns:
      name: code
out:
  explode_json_columns: ["jsons"]
  mode: append
```

結果は以下のようになります：

![](/assets/image-20191212-174043.fecf1690747866f86b39479d9ea21c2db6587e10b3660fdee00ef2c3aec96450.b2039cd8.png)

重複するnameカラムを処理するために'rename'を使用しない場合、explode_json_columnsオプションはname要素を展開せず、結果は以下のようになります：

![](/assets/image-20191212-174112.613ee98cbc74aa289c485df622df90dbaac13b1293549eef6df54faa2a436efe.b2039cd8.png)