Stream Load est une méthode synchrone basée sur HTTP permettant de charger des fichiers locaux ou des flux de données dans ApsaraDB for SelectDB. Envoyez une requête HTTP PUT et obtenez le résultat immédiatement dans le corps de la réponse, sans aucune interrogation ultérieure. Formats pris en charge : CSV, JSON, Parquet et ORC.
Vérifiez toujours le champ Status dans le corps de la réponse pour confirmer la réussite de l'importation. Une réponse HTTP 200 indique uniquement que la requête a été reçue ; le résultat réel de l'importation se trouve dans le corps du message.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une connectivité réseau entre la machine exécutant Stream Load et votre instance SelectDB
Des identifiants de connexion (nom d'utilisateur et mot de passe) pour l'instance SelectDB
Configuration de l'accès réseau :
Si votre machine ne se trouve pas dans le même Virtual Private Cloud (VPC) que l'instance SelectDB, demandez un endpoint public.
Ajoutez les adresses IP de votre machine à la liste d'autorisation de l'instance.
-
Si votre machine dispose d'une liste d'autorisation sortante, ajoutez-y la plage IP de l'instance SelectDB :
IP VPC : Consultez la rubrique Comment afficher les adresses IP du VPC auquel appartient mon instance ApsaraDB SelectDB ?
IP publique : Exécutez la commande
ping <public-endpoint>pour obtenir l'adresse IP.
Remarques d'utilisation
Une seule tâche Stream Load peut écrire de plusieurs centaines de Mo jusqu'à 1 Go de données. Le chargement fréquent de petits volumes de données dégrade les performances de l'instance et peut provoquer des blocages de table. Privilégiez le traitement par lots pour réduire la fréquence des chargements :
Regroupement côté application : Accumulez les données dans votre application avant d'envoyer une requête Stream Load.
Regroupement côté serveur : Utilisez Group Commit pour permettre à SelectDB de regrouper les requêtes entrantes côté serveur.
Fonctionnement de Stream Load
Envoyez une requête HTTP PUT avec le fichier de données en pièce jointe.
SelectDB traite les données de manière synchrone et les écrit dans la table cible.
Le corps de la réponse contient le résultat de l'importation, incluant un champ
Statuset des métriques au niveau des lignes.
Charger des données avec Stream Load
Stream Load utilise des requêtes HTTP PUT. Les exemples ci-dessous emploient curl, mais tout client HTTP est compatible.
Syntaxe
curl --location-trusted \
-u <username>:<password> \
-H "expect:100-continue" \
[-H "<header-key>:<header-value>"] \
-T <file-path> \
-XPUT http://<host>:<port>/api/<db_name>/<table_name>/_stream_load
Remplacez les espaces réservés par vos valeurs réelles :
| Espace réservé | Description | Exemple |
|---|---|---|
<username> |
Nom d'utilisateur SelectDB | admin |
<password> |
Mot de passe SelectDB | your-password |
<host> |
Endpoint VPC ou endpoint public de l'instance | selectdb-cn-xxx-fe.selectdbfe.rds.aliyuncs.com |
<port> |
Port HTTP. Valeur par défaut : 8080 |
8080 |
<db_name> |
Nom de la base de données cible | test_db |
<table_name> |
Nom de la table cible | test_table |
<file-path> |
Chemin vers le fichier de données local | ./data.csv |
Choix de l'endpoint approprié :
Même VPC : Utilisez l'endpoint VPC.
VPC différent ou hors Alibaba Cloud : Utilisez l'endpoint public. Ces deux endpoints figurent sur la page de détails de l'instance dans la console SelectDB.
En-têtes de requête
Définissez les options d'importation sous forme d'en-têtes HTTP via -H "key:value".
| En-tête | Valeur par défaut | Description |
|---|---|---|
label |
Généré par le système | ID unique pour cette tâche d'importation. Réutilisez le même libellé pour les tentatives concernant le même lot de données afin d'éviter les doublons (sémantique At-Most-Once). Les libellés deviennent réutilisables une fois que la tâche correspondante atteint le statut CANCELLED. |
format |
CSV |
Format des données. Valeurs prises en charge : CSV, JSON, PARQUET, ORC, csv_with_names (ignore la première ligne), csv_with_names_and_types (ignore les deux premières lignes). Consultez Formats de fichiers pour les paramètres spécifiques à chaque format. |
column_separator |
\t |
Délimiteur de colonnes. Accepte les délimiteurs multi-caractères. Pour les caractères non imprimables, utilisez le format hexadécimal avec le préfixe \x (par exemple, le séparateur Hive \x01 s'écrit -H "column_separator:\x01"). |
line_delimiter |
\n |
Délimiteur de lignes. Sous Windows, utilisez \r\n. Accepte les délimiteurs multi-caractères. |
compress_type |
Aucune | Format de compression. Valeurs prises en charge : gz, lzo, bz2, lz4, lzop, deflate. Uniquement compatible avec les fichiers CSV et JSON. |
max_filter_ratio |
0 |
Proportion maximale de lignes pouvant échouer aux contrôles de qualité des données. Plage : [0, 1]. La valeur par défaut 0 implique une tolérance zéro : toute ligne incorrecte fait échouer la tâche. Définissez une valeur supérieure à 0 pour autoriser le saut de certaines lignes. |
strict_mode |
false |
Si défini à true, applique une vérification stricte des types lors de la conversion des colonnes. Les lignes dont une valeur source non nulle est convertie en NULL sont filtrées. |
cloud_cluster |
Valeur par défaut de l'instance | Spécifie le cluster de calcul chargé de l'importation. En l'absence de cluster par défaut, SelectDB en sélectionne un automatiquement selon vos permissions. |
load_to_single_tablet |
false |
Si défini à true, écrit toutes les données dans un seul tablet au sein de la partition cible. Applicable uniquement aux tables Duplicate Key avec bucketing aléatoire. Améliore le débit pour les importations à haute concurrence. |
where |
Aucune | Condition de filtrage SQL. Les lignes ne correspondant pas sont exclues de l'importation et comptabilisées dans NumberUnselectedRows, mais pas dans le calcul du ratio de filtrage. |
partitions |
Aucune | Restreint l'importation aux partitions spécifiées. Les lignes extérieures à ces partitions sont exclues et comptabilisées dans dpp.abnorm.ALL (reflété dans NumberFilteredRows). |
columns |
Aucune | Mappe et transforme les colonnes sources. Permet de réorganiser les colonnes et d'appliquer des transformations via expressions SQL, avec la même syntaxe que les expressions SELECT. |
merge_type |
APPEND |
Comportement de fusion des données. Options : APPEND (par défaut, écriture normale), MERGE (à utiliser avec delete pour marquer la colonne Delete Flag), DELETE (traite toutes les lignes comme des suppressions). MERGE et DELETE sont uniquement pris en charge sur les tables Unique Key. |
delete |
Aucune | Condition SQL pour marquer les lignes comme supprimées. Utilisé uniquement lorsque merge_type vaut MERGE. |
function_column.sequence_col |
Aucune | Pour les tables Unique Key avec colonnes de séquence. Spécifie quelle colonne (issue des données sources ou du schéma de table) détermine l'ordre de remplacement des lignes. |
exec_mem_limit |
2147483648 |
Limite de mémoire pour la tâche d'importation, en octets. Valeur par défaut : 2 Gio. |
timeout |
600 |
Délai d'expiration de l'importation en secondes. Plage : [1, 259200]. La tâche est automatiquement annulée si elle dépasse cette limite. |
timezone |
Asia/Shanghai |
Fuseau horaire pour les fonctions temporelles durant l'importation. Utilise les noms de fuseaux horaires IANA. |
two_phase_commit |
false |
Si défini à true, les données sont écrites mais restent invisibles jusqu'à validation manuelle de la transaction. Le statut de la transaction reste PRECOMMITTED jusqu'à sa validation. Utile pour garantir une importation atomique (tout ou rien). |
jsonpaths |
Aucune | Modèle d'extraction de champs JSON, par exemple ["$.status", "$.res.id"]. Nécessaire lorsque la structure JSON ne correspond pas directement aux colonnes de la table. Sans ce paramètre, les clés doivent correspondre aux noms des colonnes (l'ordre peut différer). |
json_root |
"" (objet entier) |
Expression JSONPath sélectionnant un objet enfant comme racine pour l'analyse. |
read_json_by_line |
false |
Si défini à true, traite chaque ligne comme un objet JSON distinct. Si défini à false, le fichier entier est analysé comme une seule valeur ou un tableau JSON. |
strip_outer_array |
false |
Si défini à true, retire le tableau externe d'un tableau JSON et importe chaque élément comme une ligne distincte. Si défini à false, le tableau entier est importé comme un seul enregistrement. Le format JSON non-tableau offre des performances nettement supérieures au format tableau. |
Exemple
Importez data.csv dans test_table au sein de test_db :
curl --location-trusted \
-u admin:admin_123 \
-T data.csv \
-H "label:123" \
-H "expect:100-continue" \
http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Réponse
Stream Load retourne le résultat de manière synchrone. Vérifiez le champ Status — et non le code de statut HTTP — pour déterminer si l'opération a réussi.
{
"TxnId": 17,
"Label": "707717c0-271a-44c5-be0b-4e71bfeacaa5",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 5,
"NumberLoadedRows": 5,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 28,
"LoadTimeMs": 27,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 2,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 3,
"CommitAndPublishTimeMs": 18
}
| Champ | Description |
|---|---|
TxnId |
ID de la transaction. |
Label |
Libellé de l'importation. Personnalisé ou généré par le système. |
Status |
Résultat de l'importation. Success : terminée. Publish Timeout : terminée mais les données peuvent être temporairement invisibles ; ne relancez pas la tâche. Label Already Exists : libellé dupliqué, modifiez-le. Fail : échec de l'importation. |
ExistingJobStatus |
Statut de la tâche existante associée à un libellé dupliqué. Présent uniquement lorsque Status vaut Label Already Exists. Valeurs possibles : RUNNING ou FINISHED. |
Message |
Message d'erreur, le cas échéant. |
NumberTotalRows |
Nombre total de lignes traitées. |
NumberLoadedRows |
Lignes importées avec succès. |
NumberFilteredRows |
Lignes filtrées en raison de problèmes de qualité des données. |
NumberUnselectedRows |
Lignes exclues par la condition where. |
LoadBytes |
Octets importés. |
LoadTimeMs |
Durée totale de l'importation, en millisecondes. |
BeginTxnTimeMs |
Temps nécessaire pour démarrer la transaction sur le frontend (FE), en millisecondes. |
StreamLoadPutTimeMs |
Temps nécessaire pour obtenir le plan d'exécution depuis le FE, en millisecondes. |
ReadDataTimeMs |
Temps consacré à la lecture des données sources, en millisecondes. |
WriteDataTimeMs |
Temps consacré à l'écriture des données, en millisecondes. |
CommitAndPublishTimeMs |
Temps nécessaire pour valider et publier la transaction, en millisecondes. |
ErrorURL |
En cas de problèmes de qualité des données, accédez à cette URL pour consulter les lignes erronées spécifiques. |
Inspecter les erreurs d'importation
En cas de problèmes de qualité des données, utilisez ErrorURL pour télécharger les lignes rejetées :
curl "<ErrorURL>"
# or save to a file:
wget "<ErrorURL>" -O error_rows.txt
Annuler et consulter les tâches d'importation
Les tâches Stream Load ne peuvent pas être annulées manuellement après leur envoi. Le système annule automatiquement une tâche si elle dépasse le délai d'expiration ou rencontre une erreur irrécupérable.
Pour consulter les tâches Stream Load terminées, activez d'abord l'enregistrement des opérations Stream Load, puis connectez-vous à l'instance via un client MySQL et exécutez :
SHOW STREAM LOAD;
Importer des données CSV
Exemple : Importation via script
Configurer la table de destination
-
Créez la base de données et la table :
CREATE DATABASE test_db; CREATE TABLE test_table ( id int, name varchar(50), age int, address varchar(50), url varchar(500) ) UNIQUE KEY(`id`, `name`) DISTRIBUTED BY HASH(id) BUCKETS 16 PROPERTIES("replication_num" = "1"); -
Sur la machine où vous exécuterez Stream Load, créez un fichier nommé
test.csv:1,yang,32,shanghai,http://example.com 2,wang,22,beijing,http://example.com 3,xiao,23,shenzhen,http://example.com 4,jess,45,hangzhou,http://example.com 5,jack,14,shanghai,http://example.com 6,tomy,25,hangzhou,http://example.com 7,lucy,45,shanghai,http://example.com 8,tengyin,26,shanghai,http://example.com 9,wangli,27,shenzhen,http://example.com 10,xiaohua,37,shanghai,http://example.com
Dédupliquer avec un libellé et définir un délai d'expiration personnalisé
Importez test.csv avec un libellé pour éviter les importations dupliquées et un délai d'expiration personnalisé de 100 secondes :
curl --location-trusted \
-u admin:admin_123 \
-H "label:123" \
-H "timeout:100" \
-H "expect:100-continue" \
-H "column_separator:," \
-T test.csv \
http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Filtrer les lignes par valeur de colonne
Importez uniquement les lignes où address vaut hangzhou, en utilisant le mappage de colonnes pour spécifier l'ordre des champs :
curl --location-trusted \
-u admin:admin_123 \
-H "label:123" \
-H "columns: id,name,age,address,url" \
-H "where: address='hangzhou'" \
-H "expect:100-continue" \
-H "column_separator:," \
-T test.csv \
http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Autoriser une tolérance d'erreur de 20 %
Effectuez l'importation en autorisant jusqu'à 20 % de lignes à échouer aux contrôles de qualité des données :
curl --location-trusted \
-u admin:admin_123 \
-H "label:123" \
-H "max_filter_ratio:0.2" \
-H "expect:100-continue" \
-T test.csv \
http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Activer le mode strict avec un fuseau horaire personnalisé
Appliquez une vérification stricte des types et définissez le fuseau horaire sur Africa/Abidjan :
curl --location-trusted \
-u admin:admin_123 \
-H "strict_mode: true" \
-H "timezone: Africa/Abidjan" \
-H "expect:100-continue" \
-T test.csv \
http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Supprimer les lignes correspondantes dans SelectDB
Supprimez de test_table toutes les lignes correspondant à celles de test.csv :
curl --location-trusted \
-u admin:admin_123 \
-H "merge_type: DELETE" \
-H "expect:100-continue" \
-T test.csv \
http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Supprimer des lignes selon une condition et importer le reste
Supprimez les lignes où address vaut hangzhou et importez les lignes restantes :
curl --location-trusted \
-u admin:admin_123 \
-H "expect:100-continue" \
-H "columns: id,name,age,address,url" \
-H "merge_type: MERGE" \
-H "delete: address='hangzhou'" \
-H "column_separator:," \
-T test.csv \
http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/testDb/testTbl/_stream_load
Exemple : Importation via code Java
L'exemple suivant présente une implémentation Java complète utilisant Apache HttpClient. Vérifiez le champ Status dans le corps de la réponse pour confirmer la réussite, et non le code de statut HTTP.
package com.selectdb.x2doris.connector.doris.writer;
import com.alibaba.fastjson2.JSON;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultRedirectStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.RequestContent;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.util.Map;
public class DorisLoadCase {
public static void main(String[] args) throws Exception {
// 1. Configure parameters.
String loadUrl = "http://<Host:Port>/api/<DB>/<TABLE>/_stream_load?";
String userName = "admin";
String password = "****";
// 2. Build the HTTP client. Redirection (isRedirectable) must be enabled.
HttpClientBuilder httpClientBuilder = HttpClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() {
@Override
protected boolean isRedirectable(String method) {
return true;
}
});
httpClientBuilder.addInterceptorLast(new RequestContent(true));
HttpClient httpClient = httpClientBuilder.build();
// 3. Build the PUT request.
HttpPut httpPut = new HttpPut(loadUrl);
// Set authentication and content headers.
String basicAuth = Base64.getEncoder().encodeToString(
String.format("%s:%s", userName, password).getBytes(StandardCharsets.UTF_8));
httpPut.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + basicAuth);
httpPut.addHeader(HttpHeaders.EXPECT, "100-continue");
httpPut.addHeader(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8");
RequestConfig reqConfig = RequestConfig.custom().setConnectTimeout(30000).build();
httpPut.setConfig(reqConfig);
// 4. Read the CSV file and attach it as the request body.
// Default CSV delimiters: row = \n, column = \t
List<String> lines = Files.readAllLines(Paths.get("your_file.csv"));
String data = String.join("\n", lines);
httpPut.setEntity(new StringEntity(data));
// 5. Send the request and check the result.
HttpResponse httpResponse = httpClient.execute(httpPut);
int httpStatus = httpResponse.getStatusLine().getStatusCode();
String respContent = EntityUtils.toString(
new BufferedHttpEntity(httpResponse.getEntity()), StandardCharsets.UTF_8);
String respMsg = httpResponse.getStatusLine().getReasonPhrase();
if (httpStatus == HttpStatus.SC_OK) {
// HTTP 200 does not guarantee import success.
// Always check the Status field returned by SelectDB.
Map<String, String> respAsMap = JSON.parseObject(respContent, Map.class);
String dorisStatus = respAsMap.get("Status");
List<String> DORIS_SUCCESS_STATUS = Arrays.asList("Success", "Publish Timeout", "200");
if (!DORIS_SUCCESS_STATUS.contains(dorisStatus) || !respMsg.equals("OK")) {
throw new RuntimeException(
"StreamLoad failed, status: " + dorisStatus + ", Response: " + respMsg);
} else {
System.out.println("Import successful.");
}
} else {
throw new IOException(
"StreamLoad HTTP error: " + httpStatus + ", url: " + loadUrl + ", error: " + respMsg);
}
}
}
Importer des données JSON
Le format JSON non-tableau offre des performances nettement supérieures au format tableau. Privilégiez le format JSON délimité par des lignes (read_json_by_line:true) lorsque cela est possible.
Configurer la table de destination
-
Créez la base de données et la table :
CREATE DATABASE test_db; CREATE TABLE test_table ( id int, name varchar(50), age int ) UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 16 PROPERTIES("replication_num" = "1");
Importer du JSON délimité par lignes (recommandé)
Créez un fichier json.data contenant un objet JSON par ligne :
{"id":1,"name":"Emily","age":25}
{"id":2,"name":"Benjamin","age":35}
{"id":3,"name":"Olivia","age":28}
{"id":4,"name":"Alexander","age":60}
{"id":5,"name":"Ava","age":17}
Importez-le avec read_json_by_line:true :
curl --location-trusted \
-u admin:admin_123 \
-H "Expect:100-continue" \
-H "format:json" \
-H "read_json_by_line:true" \
-T json.data \
-XPUT http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Importer un tableau JSON
Créez un fichier json_array.data au format tableau JSON :
[
{"userid":1,"username":"Emily","userage":25},
{"userid":2,"username":"Benjamin","userage":35},
{"userid":3,"username":"Olivia","userage":28},
{"userid":4,"username":"Alexander","userage":60},
{"userid":5,"username":"Ava","userage":17}
]
Importez-le avec strip_outer_array:true et jsonpaths pour mapper les noms de champs non concordants :
curl --location-trusted \
-u admin:admin_123 \
-H "Expect:100-continue" \
-H "format:json" \
-H "jsonpaths:[\"$.userid\", \"$.userage\", \"$.username\"]" \
-H "columns:id,age,name" \
-H "strip_outer_array:true" \
-T json_array.data \
-XPUT http://selectdb-cn-h033cjs****-fe.selectdbfe.pre.rds.aliyuncs.com:8080/api/test_db/test_table/_stream_load
Mode HTTP Stream
Le mode HTTP Stream (http_stream) permet de spécifier les paramètres d'importation sous forme d'expression SQL dans l'en-tête de requête, grâce à la fonctionnalité Table Value Function (TVF). L'endpoint API diffère de celui du Stream Load standard :
Stream Load standard :
http://host:http_port/api/{db}/{table}/_stream_loadMode HTTP Stream :
http://host:http_port/api/_http_stream
Syntaxe
curl --location-trusted \
-u <username>:<password> \
-H "sql: ${load_sql}" \
-T <file_name> \
-XPUT http://host:http_port/api/_http_stream
L'en-tête load_sql remplace les en-têtes individuels tels que column_separator, line_delimiter, where et columns par une instruction SQL unique :
INSERT INTO db.table (col, ...) SELECT stream_col, ... FROM http_stream("property1"="value1");
Exemple
curl --location-trusted \
-u admin:admin_123 \
-T test.csv \
-H "sql:insert into demo.example_tbl_1(user_id, age, cost) select c1, c4, c7 * 2 from http_stream(\"format\" = \"CSV\", \"column_separator\" = \",\" ) where age >= 30" \
http://host:http_port/api/_http_stream
Pour plus d'informations sur les TVF, consultez TVF.Formats de fichiers
Configuration optionnelle
Facultatif : Activer l'enregistrement des opérations Stream Load
Par défaut, le cluster de calcul n'enregistre pas les opérations Stream Load. Pour activer l'enregistrement :
Définissez le paramètre backend
enable_stream_load_recordsurtrue.Redémarrez le cluster de calcul.
L'activation de cette fonctionnalité nécessite la soumission d'un ticket de support.
Facultatif : Augmenter la taille maximale de fichier
La taille maximale de fichier par défaut pour une tâche Stream Load est de 10 240 Mo. Pour l'augmenter, ajustez le paramètre backend streaming_load_max_mb. Pour les instructions, consultez Configurer les paramètres.
Facultatif : Ajuster le délai d'expiration par défaut
Le délai d'expiration par défaut est de 600 secondes. Vous pouvez le remplacer pour chaque tâche via l'en-tête timeout. Pour modifier la valeur globale par défaut, définissez le paramètre frontend (FE) stream_load_default_timeout_second et redémarrez l'instance.
La modification des paramètres globaux nécessite la soumission d'un ticket de support.
FAQ
Quelle est la cause de l'erreur « get table cloud commit lock timeout » ?
Cette erreur indique que les écritures sont trop fréquentes, ce qui provoque un verrouillage de la table. Réduisez la fréquence d'écriture et regroupez vos données. Une seule tâche Stream Load doit cibler plusieurs centaines de Mo à 1 Go de données par requête. Consultez les Remarques d'utilisation pour les stratégies de regroupement.
Comment gérer des données CSV contenant des délimiteurs de colonnes ou de lignes ?
Spécifiez de nouveaux délimiteurs et mettez à jour le fichier de données afin que les caractères de délimitation présents dans vos données n'entrent pas en conflit avec les délimiteurs choisis.
Les données contiennent le délimiteur de lignes
Si vos données contiennent le délimiteur de lignes par défaut \n comme valeur de donnée (et non comme fin de ligne), spécifiez un délimiteur de lignes différent.
Exemple — fichier original :
Zhang San\n,25,Shaanxi
Li Si\n,30,Beijing
Étapes :
Définissez un nouveau délimiteur de lignes : ajoutez
-H "line_delimiter:\r\n"à votre requête.-
Mettez à jour le fichier pour terminer chaque ligne avec le nouveau délimiteur :
Zhang San\n,25,Shaanxi\r\n Li Si\n,30,Beijing\r\n
Les données contiennent le délimiteur de colonnes
Si vos données contiennent le délimiteur de colonnes par défaut \t (tabulation) comme valeur de donnée, spécifiez un délimiteur de colonnes différent.
Exemple — fichier original :
Zhang San\t 25 Shaanxi
Li Si\t 30 Beijing
Étapes :
Définissez un nouveau délimiteur de colonnes : ajoutez
-H "column_separator:,"à votre requête.-
Mettez à jour le fichier pour séparer les colonnes avec le nouveau délimiteur :
Zhang San\t,25,Shaanxi Li Si\t,30,Beijing
Étapes suivantes
Group Commit — regroupez les requêtes Stream Load entrantes côté serveur pour réduire la fréquence d'écriture
Configurer les paramètres — ajustez les paramètres backend tels que
streaming_load_max_mbSe connecter à une instance ApsaraDB for SelectDB via un client MySQL