データ形式の色々：CSV、JSON、XML、Parquet、Avro（PHP編）

前回CSVファイルのインポートについて記事を書いた。

CSVはよく聞くけど他にもインポートできる形があるのではないかと疑問に思ったので調べてみた。

どんな形のものか踏まえて5つ書き出す。

# 1. CSV (Comma-Separated Values)
略称しか知らなかった。こう見ると構造も覚えやすいかもしれない。

## 特徴

- 形式の概要
    - 各行が1レコードを表す。カンマやタブで区切られた値が連なる形式
- メリット
    - 内容が直感的に把握できる
    - 多くのプログラミング言語やツールでサポートされている
- デメリット
    - 階層構造や複雑なデータ表現には不向き
    - 区切り文字自体がデータに含まれる場合はエスケープ処理が必要


### CSVの中身
```
名前,年齢,職業
斎藤,55,フリーター
岡部,25,テスター
```

### PHPで読み込む場合
```php
<?php
$csvFile = 'data.csv';
if (($handle = fopen($csvFile, "r")) !== FALSE) {
    while (($data = fgetcsv($handle)) !== FALSE) {
        print_r($data);
    }
    fclose($handle);
}
?>

```

# 2. JSON (JavaScript Object Notation)

## 特徴

- 形式の概要
    キーと値のペアでデータを表現する。ネストしたデータ構造も扱える。
- メリット
    - 階層構造や複雑なデータ表現が容易
    - 多くのWeb APIやシステムで標準的に利用されている
- デメリット
    - 単純な表形式データの場合は情報が冗長になる可能性がある


### JSONの中身
```
{
  "users": [
    {"name": "田中", "age": 30, "occupation": "エンジニア"},
    {"name": "鈴木", "age": 25, "occupation": "デザイナー"}
  ]
}
```

連想配列の中身みたいだ。

### PHPで読み込む場合
```php
<?php
$jsonString = file_get_contents("data.json");
$data = json_decode($jsonString, true);
print_r($data);
?>

```


# 3. XML (eXtensible Markup Language)
HTMLでよくマークアップ言語とか出てきていたイメージ。それ以外ではあまり聞かない。
## 特徴

- 形式の概要
    - タグを利用してデータとその意味（メタデータ）を階層的に表現するマークアップ言語
- メリット
    - 複雑なデータ表現が可能
    - 標準化されており多くのシステムで利用される
- デメリット
    - ファイルサイズが大きくなることがある
    - 直接編集するにはやや扱いにくい

### XMLの中身

```
<users>
  <user>
    <name>田中</name>
    <age>30</age>
    <occupation>エンジニア</occupation>
  </user>
  <user>
    <name>鈴木</name>
    <age>25</age>
    <occupation>デザイナー</occupation>
  </user>
</users>
```

### PHPで読み込む場合
```php
<?php
$xml = simplexml_load_file("data.xml");
print_r($xml);
?>
```

# 4. Parquet
聞いたこともない形式。
## 特徴

- 形式の概要
    - 列指向のバイナリファイル形式。大規模なデータ分析に最適
- メリット
    - 高い圧縮率と高速な読み込みが可能
    - 列ごとに圧縮される。特定のカラムに対するクエリが高速
    - スキーマ情報が含まれているのでデータ構造が明確
- デメリット
    - バイナリ形式なので直接ファイル内容を確認することが困難
    - 専用ライブラリが必要になる

※バイナリ形式とは
データを「0」と「1」という二進数だけで表現する形式のこと

※スキーマとは
データの構造やフォーマットを定義する設計図
フィールド間の関係やデータの階層構造（ネストされたオブジェクトや配列）を明示する。

### PHPで読み込む場合
```php
<?php
// 事前にComposerで parquet-php ライブラリをインストールする必要がある
require 'vendor/autoload.php';

use Parquet\ParquetReader;

$parquetFile = 'data.parquet';
$reader = new ParquetReader($parquetFile);
$rows = $reader->getRowGroup(0)->getData();

print_r($rows);
?>

```


# 5. Avro
これも聞いたことがない。
## 特徴
- 形式の概要
    - Apache Hadoop向けに設計されたデータシリアライゼーションシステム。バイナリ形式かつスキーマ情報を同梱するため、スキーマ進化に柔軟に対応できる
- メリット
    - コンパクトなバイナリ形式で効率的なストレージが可能
    - スキーマが同梱されるためデータ解釈が簡単
    - スキーマ変更に対応しやすい
- デメリット
    - バイナリ形式のため人間が直接内容を確認するのは難しい
    - 専用のライブラリやツールが必要

※Apache Hadoop
ビッグデータの処理と保存のために開発されたオープンソースの分散処理フレームワーク。
複数のコンピュータを用いて大規模なデータセットを並列処理するための仕組みを提供している。


※データシリアライゼーション
プログラム内のオブジェクトやデータ構造をファイルやネットワーク通信で利用できる形式に変換するプロセス。


### PHPで読み込む場合

```php
<?php
// 事前にComposerでApache AvroのPHPライブラリをインストールする必要がある
require 'vendor/autoload.php';

use Avro\DataFile\AvroDataIOReader;
use Avro\Datum\AvroIODatumReader;

$avroFile = 'data.avro';
$fp = fopen($avroFile, 'rb');
$reader = new AvroDataIOReader($fp, new AvroIODatumReader());

while ($reader->hasNext()) {
    $record = $reader->next();
    print_r($record);
}

$reader->close();
fclose($fp);
?>
```

# 私的感想
とても勝手ですが、今後もほぼCSVで対応しそう。
JSONで外部からの取り込みはあまりなさそう。

集めたデータを分析する場合にParquetを使うのかな。

速度の話が出てきていたがそんなに変わるのだろうか。
まだその領域に達していないのでそういった場面に遭遇するまで学びを進めていこう。