> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentation sur le format Arrow

# Arrow

| Entrée | Sortie | Alias |
| - | - | - |
| ✔ | ✔ | |

## Description

[Apache Arrow](https://arrow.apache.org/) propose deux formats de stockage en colonnes intégrés.
ClickHouse prend en charge les opérations de lecture et d'écriture pour ces formats.
`Arrow` est le format « mode fichier » d'Apache Arrow, conçu pour un accès aléatoire en mémoire.

## Correspondance des types de données

Le tableau ci-dessous présente les types de données pris en charge et leur correspondance avec les [types de données](/docs/fr/reference/data-types/index.md) de ClickHouse dans les requêtes `INSERT` et `SELECT`.

| Type de données Arrow (`INSERT`) | Type de données ClickHouse | Type de données Arrow (`SELECT`) |
| - | - | - |
| `BOOL` | [Bool](/docs/fr/reference/data-types/boolean.md) | `BOOL` |
| `UINT8`, `BOOL` | [UInt8](/docs/fr/reference/data-types/int-uint.md) | `UINT8` |
| `INT8` | [Int8](/docs/fr/reference/data-types/int-uint.md)/[Enum8](/docs/fr/reference/data-types/enum.md) | `INT8` |
| `UINT16` | [UInt16](/docs/fr/reference/data-types/int-uint.md) | `UINT16` |
| `INT16` | [Int16](/docs/fr/reference/data-types/int-uint.md)/[Enum16](/docs/fr/reference/data-types/enum.md) | `INT16` |
| `UINT32` | [UInt32](/docs/fr/reference/data-types/int-uint.md) | `UINT32` |
| `INT32` | [Int32](/docs/fr/reference/data-types/int-uint.md) | `INT32` |
| `UINT64` | [UInt64](/docs/fr/reference/data-types/int-uint.md) | `UINT64` |
| `INT64` | [Int64](/docs/fr/reference/data-types/int-uint.md) | `INT64` |
| `FLOAT`, `HALF_FLOAT` | [Float32](/docs/fr/reference/data-types/float.md) | `FLOAT32` |
| `DOUBLE` | [Float64](/docs/fr/reference/data-types/float.md) | `FLOAT64` |
| `DATE32` | [Date32](/docs/fr/reference/data-types/date32.md) | `UINT16` |
| `DATE64` | [DateTime](/docs/fr/reference/data-types/datetime.md) | `UINT32` |
| `TIMESTAMP` | [DateTime64](/docs/fr/reference/data-types/datetime64.md) | `TIMESTAMP` |
| `TIME32`, `TIME64` | [Time64](/docs/fr/reference/data-types/time64.md) | `TIME32`, `TIME64` |
| `STRING`, `BINARY` | [String](/docs/fr/reference/data-types/string.md) | `BINARY` |
| `STRING`, `BINARY`, `FIXED_SIZE_BINARY` | [FixedString](/docs/fr/reference/data-types/fixedstring.md) | `FIXED_SIZE_BINARY` |
| `DECIMAL` | [Decimal](/docs/fr/reference/data-types/decimal.md) | `DECIMAL` |
| `DECIMAL256` | [Decimal256](/docs/fr/reference/data-types/decimal.md) | `DECIMAL256` |
| `LIST` | [Array](/docs/fr/reference/data-types/array.md) | `LIST` |
| `STRUCT` | [Tuple](/docs/fr/reference/data-types/tuple.md) | `STRUCT` |
| `MAP` | [Map](/docs/fr/reference/data-types/map.md) | `MAP` |
| `UINT32` | [IPv4](/docs/fr/reference/data-types/ipv4.md) | `UINT32` |
| `FIXED_SIZE_BINARY`, `BINARY` | [IPv6](/docs/fr/reference/data-types/ipv6.md) | `FIXED_SIZE_BINARY` |
| `FIXED_SIZE_BINARY`, `BINARY` | [Int128/UInt128/Int256/UInt256](/docs/fr/reference/data-types/int-uint.md) | `FIXED_SIZE_BINARY` |
| `DURATION` | [Interval](/docs/fr/reference/data-types/special-data-types/interval.md) (Nanoseconde/Microseconde/Milliseconde/Seconde) | `DURATION` |
| `INT64` | [Interval](/docs/fr/reference/data-types/special-data-types/interval.md) (Minute/Heure/Jour/Semaine/Mois/Trimestre/Année) | `INT64` |

Les `Array` peuvent être imbriqués et accepter comme argument une valeur de type `Nullable`. Les types `Tuple` et `Map` peuvent également être imbriqués.

Le type `DICTIONARY` est pris en charge pour les requêtes `INSERT` et, pour les requêtes `SELECT`, le paramètre [`output_format_arrow_low_cardinality_as_dictionary`](/docs/fr/reference/settings/formats/output-format#output_format_arrow_low_cardinality_as_dictionary) permet de restituer le type [LowCardinality](/docs/fr/reference/data-types/lowcardinality.md) sous forme de type `DICTIONARY`. Notez qu'il peut y avoir des valeurs inutilisées dans le dictionnaire `LowCardinality`, ce qui peut se traduire par des valeurs inutilisées dans le `DICTIONARY` Arrow en sortie.

Types de données Arrow non pris en charge :

* `JSON`
* `ENUM`.

Les types de données des colonnes de la table ClickHouse n'ont pas besoin de correspondre aux champs de données Arrow correspondants. Lors de l'insertion de données, ClickHouse interprète les types de données conformément au tableau ci-dessus, puis [convertit](/docs/fr/reference/functions/regular-functions/type-conversion-functions.md#CAST) les données dans le type de données défini pour la colonne de la table ClickHouse.

## Exemple d’utilisation

Dans l’exemple ci-dessous, nous utilisons le jeu de données `forex` disponible dans le
[ClickHouse SQL playground](https://sql.clickhouse.com).

### Sélection des données

Nous sélectionnons une journée de taux de change `EUR/USD` dans le Playground et l’enregistrons
dans un fichier local `forex_eurusd.arrow`. Nous interrogeons le Playground via l’interface
HTTP, où le host est `sql-clickhouse.clickhouse.com` et l’utilisateur est
`demo` (qui n’a pas de mot de passe) :

```bash theme={null}
curl "https://sql-clickhouse.clickhouse.com:8443/?user=demo&database=forex" \
    --data-binary "
        SELECT
            concat(base, '.', quote) AS base_quote,
            datetime AS last_update,
            CAST(bid, 'Float32') AS bid,
            CAST(ask, 'Float32') AS ask,
            ask - bid AS spread
        FROM forex
        WHERE base = 'EUR' AND quote = 'USD'
            AND datetime >= '2020-01-01' AND datetime < '2020-01-02'
        ORDER BY datetime ASC
        FORMAT Arrow
        SETTINGS output_format_arrow_compression_method='zstd'" > forex_eurusd.arrow
```

### Lecture du fichier

Nous pouvons maintenant relire le fichier Arrow local avec
[`clickhouse-local`](/docs/fr/concepts/features/tools-and-utilities/clickhouse-local) à l’aide de la
fonction de table [`file`](/docs/fr/reference/functions/table-functions/file). Le fichier est
auto-descriptif, donc le format `Arrow` infère automatiquement le schéma :

```bash theme={null}
clickhouse-local --query "
    SELECT *
    FROM file('forex_eurusd.arrow', Arrow)
    ORDER BY last_update ASC
    LIMIT 5
    FORMAT PrettyCompact"
```

```response title="Response" theme={null}
   ┌─base_quote─┬─────────────last_update─┬─────bid─┬─────ask─┬────────────────spread─┐
1. │ EUR.USD    │ 2020-01-01 17:00:00.065 │  1.1212 │ 1.12172 │ 0.0005199909210205078 │
2. │ EUR.USD    │ 2020-01-01 17:00:10.447 │  1.1212 │ 1.12192 │ 0.0007200241088867188 │
3. │ EUR.USD    │ 2020-01-01 17:00:10.498 │ 1.12117 │ 1.12161 │ 0.0004400014877319336 │
4. │ EUR.USD    │ 2020-01-01 17:00:12.579 │  1.1212 │ 1.12161 │ 0.0004100799560546875 │
5. │ EUR.USD    │ 2020-01-01 17:00:12.630 │  1.1212 │ 1.12172 │ 0.0005199909210205078 │
   └────────────┴─────────────────────────┴─────────┴─────────┴───────────────────────┘
```

### Insertion de données

Pour charger un fichier Arrow dans une table ClickHouse, redirigez-le vers `clickhouse-client`
avec `FORMAT Arrow` :

```bash theme={null}
cat forex_eurusd.arrow | clickhouse-client --query="INSERT INTO some_table FORMAT Arrow"
```

## Paramètres du format

| Paramètre | Description | Valeur par défaut |
| - | - | - |
| `input_format_arrow_allow_missing_columns` | Autoriser les colonnes manquantes lors de la lecture des formats d'entrée Arrow | `1` |
| `input_format_arrow_case_insensitive_column_matching` | Ignorer la casse lors de la correspondance entre les colonnes Arrow et les colonnes CH | `0` |
| `input_format_arrow_import_nested` | Paramètre obsolète, sans effet. | `0` |
| `input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference` | Ignorer les colonnes dont les types ne sont pas pris en charge lors de l'inférence de schéma pour le format Arrow | `0` |
| `output_format_arrow_compression_method` | Méthode de compression du format de sortie Arrow. Codecs pris en charge : lz4\_frame, zstd, none (non compressé) | `lz4_frame` |
| `output_format_arrow_fixed_string_as_fixed_byte_array` | Utiliser le type Arrow FIXED\_SIZE\_BINARY au lieu de Binary pour les colonnes FixedString | `1` |
| `output_format_arrow_low_cardinality_as_dictionary` | Produire le type LowCardinality en tant que type Arrow Dictionary | `0` |
| `output_format_arrow_record_batch_size` | Nombre cible de lignes par lot d'enregistrements lors de la combinaison de petits blocs. La mise en tampon peut accroître l'utilisation de la mémoire et retarder le premier lot jusqu'à la fin de la requête. `0` désactive la cible de lignes. | `0` |
| `output_format_arrow_record_batch_size_bytes` | Nombre cible d'octets de données de blocs accumulées par lot d'enregistrements. La mise en tampon peut accroître l'utilisation de la mémoire et retarder le premier lot jusqu'à la fin de la requête. `0` désactive la cible d'octets. | `0` |
| `output_format_arrow_string_as_string` | Utiliser le type Arrow String au lieu de Binary pour les colonnes String | `1` |
| `output_format_arrow_unsupported_types` | Ce qui doit être produit pour un type qui n'a pas d'équivalent Arrow (par ex. `JSON`, `Dynamic`, `QBit`, `AggregateFunction`) : `throw`, `text` (une valeur `serializeText` par ligne, dans le type Arrow qu'utiliserait une colonne `String`) ou `binary` (une valeur `serializeBinary` par ligne, sous forme de `Binary` Arrow). Une `AggregateFunction` est également `Binary` en mode `text`, car sa forme textuelle est l'état d'agrégat brut. | `binary` |
| `output_format_arrow_unsupported_types_as_binary` | Remplacé par `output_format_arrow_unsupported_types` : `0` signifie `throw`, `1` signifie `binary`. Consulté uniquement tant que ce paramètre conserve sa valeur par défaut. | `1` |
| `output_format_arrow_use_64_bit_indexes_for_dictionary` | Toujours utiliser des entiers 64 bits pour les index de dictionnaire au format Arrow | `0` |
| `output_format_arrow_use_signed_indexes_for_dictionary` | Utiliser des entiers signés pour les index de dictionnaire au format Arrow | `1` |
