JSON列を展開する
JSON の文字列が入った列を、中身のキーごとの列に展開します。 API から取り込んだデータや、ログの付加情報を扱うときに使います。
入出力
| ポート | 内容 |
|---|---|
| 入力データ | データ |
| 出力データ | キーごとの列を足したデータ |
Spark エンジンでは動きません。
設定項目
- 処理対象列を選択必須
- JSON が入っている列。文字列の列だけ選べます。複数選べます。
- 処理対象列を結果から除外する
- on にすると、展開前の列を消します。
展開のしかた
JSON のキーがそのまま列名になり、表のいちばん右に足されます。
入力
| id | info |
|---|---|
| 1 | {"age": 30, "city": "東京"} |
| 2 | {"age": 25, "city": "大阪"} |
出力
| id | info | age | city |
|---|---|---|---|
| 1 | (読み取り後の形) | 30 | 東京 |
| 2 | (読み取り後の形) | 25 | 大阪 |
- 行によってキーが違っても構いません。 ないところは空欄になります
- 入れ子になったキーは、親と子を
__でつないだ 1 列になります。{"user": {"name": "山田"}}ならuser__name - 配列(
[ ])は列に分かれません。{"tags": ["赤", "青"]}ならtagsという 1 列ができ、中身は['赤', '青']という文字列になります。1 件ずつにしたいなら、このあと文字の置換で[]'と空白を外し、文字列の分割で,で分けてください - 数値は数値の列、それ以外は文字列の列になります
infoは残りますが、中身は入力した文字列そのままではありません。 読み取った結果で上書きされるので、書き方(引用符や空白)が変わります。元の文字列をそのまま残したいなら、先に文字列同士の結合でinfoを別の新規列に写しておいてください- 「処理対象列を結果から除外する」を on にすると
infoが消えます
読めない書き方
true false null が入っている JSON は読めません。 エラーになるので、先に文字の置換で別の書き方に直してください。たとえば true を "true"、null を "" にします。
空欄の行や、途中で切れた文字列が混ざっている場合も読めません。
エラーと対処
JSON として読めない値が混ざっている
列の中に 1 行でも読めない値があると、処理全体が止まります。
JSON形式ではない値が含まれています
直し方 — 対象列の中身を確かめてください。よくあるのは次の 3 つです。
truefalsenullが入っている- 文字の置換で
“true”“false”""のような形に直してから掛けます。 - 空欄の行がある
- 条件で行をフィルタで
{から始まる行だけに絞ってから掛けます。 - 途中で切れている
- 取り込み元で値が切り詰められていないかを確かめます。
選んだ列が見つからない
「処理対象列を選択」で指定した列が入力データにないとき、またはどの条件にも 1 列も当たらないとき。前の処理で列名が変わった場合にも出ます。
対象の列が存在しません。
直し方 — 列を選び直してください。列名が変わりうるデータでは、名前に頼らない選び方(型で選ぶ・前方一致)に変えると壊れにくくなります。
よく使う例
1. API の応答を展開する
お題 — 取り込んだデータの 1 列に JSON が入っていて、中身で絞り込みたい
入力 — info に {"age": 30, "city": "東京"}
設定 — 処理対象列に info
出力 — age city の 2 列が増える
2. 展開前の列を消す
お題 — 展開したら元の JSON は要らない
入力 — id info
設定 — 「処理対象列を結果から除外する」を on
出力 — id age city(info は消える)
3. 複数の JSON 列をまとめて展開する
お題 — JSON の列が 2 つある
入力 — info と meta
設定 — 処理対象列に 2 列とも選ぶ
出力 — 両方の列のキーがすべて列として増える
4. 入れ子の値を取り出す
お題 — 1 段深いところに入っている値を列にしたい
入力 — info に {"user": {"name": "山田", "age": 30}}
設定 — 処理対象列に info
出力 — user__name に 山田、user__age に 30
5. 壊れた行を避ける
お題 — 一部の行の JSON が壊れていて止まる
入力 — info に空欄の行が混ざっている
設定 — 処理対象列に info
手順 — 条件で行をフィルタで { から始まる行だけに絞ってから展開する
出力 — 絞り込んだ行だけが展開される