IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NoSQL Discussion :

Stocker et extraire des données dans une base Cassandra


Sujet :

NoSQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Points : 64
    Points
    64
    Par défaut Stocker et extraire des données dans une base Cassandra
    Bonjour à vous,

    J'ai des données stockés dans des fichiers CSV et suite à des contraintes professionels on me demande de les stockers (et bien sûre les extraire après) dans une base Cassandra.

    Pour cela, j'ai crée un keyspace avec des tables mais j'ai eu des problème pour deux types des données.

    Premièrement, pour les données de type 'set' ou j'avais des données dans mon fichier csv de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [[152.99691968, -26.853342008], [153.151394048, -26.853342008], [153.151394048, -26.359622999], [152.99691968, -26.359622999]]
    ou de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ['exemple']
    ['exemple1','exemple2']
    Lors de la création des tables j'ai précisé le type set<text> pour ce type des données. En vérifiant les données dans ma base, j'ai rémarqué que les données sont mal stocké et des données ont été perdu. Par contre, quand je les stockes dans une table cassandra mais avec type text, les données sont bien stockés mais lors de l'extraction je n'arrive pas à utiliser les index pour extraire les éléments de chaque set.
    En d'autre terme, le code suivant me rend rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    list(set_extraite)[0]
    La deuxième souci est avec les données de type Date Time. J'avais des données du genre '10/13/2017 11:35:35'. J'ai utilisé le type timestamp pour stocker ces données mais quand j'ai essayé de les extraire et identifier par exemple l'année je m'arrive pas à le faire.

    Avez-vous une idée comment me faut procéder pour bien manipuler les données de type set et Date Time s'il vous plaît ?

  2. #2
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Bonsoir,

    Pour les dates et heures, il faut spécifier le format utilisé dans le fichier CSV.

    Exemple avec ce fichier t1.csv qui contient une entête et 2 lignes de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id;date1;date2
    1;'10/13/2017 11:35:35';
    2;'10/13/2017 11:35:35';10/13/2017 11:35:35

    Je me crée une table t1 et j'essaye de la charger par la commande COPY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true ;
     
    use test ;
     
    create table test.t1 (
      id    smallint,
      date1 text,
      date2 timestamp,
      primary key (id)
    ) ;
     
    copy test.t1 from 'f:\t1.csv' with header=true and delimiter=';' ;
    J'obtiens cette erreur :

    Failed to import 1 rows: ParseError - Failed to parse 10/13/2017 11:35:35 : can't interpret '10/13/2017 11:35:35' as a date with format %Y-%m-%d %H:%M:%S.%f%z or as int
    Les données du fichier CSV ne collant pas au format utilisé par défaut, il faut spécifier le format dans la commande de chargement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy test.t1 from 'f:\t1.csv' with header=true and delimiter=';' and datetimeformat = '%m/%d/%Y %H:%M:%S' ;

  3. #3
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Ensuite j'ai un soucis de compréhension, car vous dites utiliser le 'set' comme type de données, mais vos données sont entre crochets [].

    Or dans la doc, il est dit que Cassandra gère des collections qui sont de 3 types : Maps, Sets et Lists, et que pour le type 'set', les valeurs doivent être entre accolades {}, et non pas entre crochets.

    C'est le type 'list" qui utilise les crochets [].

    http://cassandra.apache.org/doc/late...ml#collections

    Ce premier point est à vérifier.


    Et pour finir, si j'ai bien compris, les types de données 'set' et 'list' sont des collections, donc un ensemble d'éléments, chaque élément étant un type primitif (une chaîne de caractère, un nombre...) ou bien un UDT (User-Defined Type), mais pas une collection.

    En clair, pour moi, on ne peut pas imbriquer une collection dans une collection.

    Dans votre jeu de données, pour moi :
    ['exemple1','exemple2'] est une liste d'éléments de type texte
    [152.99691968, -26.853342008] est une liste d'éléments de type numérique

    Par contre :
    [[152.99691968, -26.853342008], [153.151394048, -26.853342008], [153.151394048, -26.359622999], [152.99691968, -26.359622999]]
    est une liste d'éléments de type liste !

    D'après ce que je lis sur Internet, et suivant les versions de Cassandra, on ne peut pas imbriquer une collection dans une collection, sauf si l'on utilise des Frozen Collections :
    https://docs.datastax.com/en/cql/3.3...on_type_r.html

    Mais là je n'ai pas tout compris et il va falloir faire des tests.

    En espérant vous avoir aidé.

  4. #4
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Bonsoir,

    Désolé de ce complément d'informations tardif, mais je débute en Cassandra.

    Pour mieux comprendre comment fonctionnent les collections, j'ai créé ces quelques données :

    id;val1
    1;[152.99691968, -26.853342008]
    2;[8.9,2.3,-5.6,7.8,2.1]
    3;[8.9,2.3,-5.6,7.8,2.3]
    4;{153.151394048, -26.853342008}
    5;{8.9,2.3,-5.6,7.8,2.1}
    6;{8.9,2.3,-5.6,7.8,2.3}
    Données qui m'ont permises de peupler les 2 tables suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    create table test.t2 (
      id   smallint,
      val1 set<float>,
      primary key (id)
    ) ;
     
    copy test.t2 from 'f:\t2.csv' with header=true and delimiter=';' ;
     
     
    create table test.t3 (
      id   smallint,
      val1 list<float>,
      primary key (id)
    ) ;
     
    copy test.t3 from 'f:\t2.csv' with header=true and delimiter=';' ;
    Les 2 tables sont pratiquement identiques, sauf la colonne VAL1 qui est d'abord de type SET dans T2, et de type LIST dans T3.

    Comme on peut le voir :
    - pour la table T2 qui utilise un type SET, les données sont entre accolades {}, les données sont triées et les valeurs sont uniques (pas de doublons)
    - pour la table T3 qui utilise un type LIST, les données sont entre crochets [], les données ne sont pas triées et il existe des valeurs en double

    Cela revient à dire que pour le type LIST, c'est comme si les données du fichier étaient directement chargées dans la table, de manière brute.

    Alors qu'avec le type SET, les données sont implicitement triées avant le chargement en table, ceci afin d'éliminer les doublons.


    cqlsh:test> select * from test.t2 ;

    id | val1
    ----+----------------------------
    6 | {-5.6, 2.3, 7.8, 8.9}
    3 | {-5.6, 2.3, 7.8, 8.9}
    2 | {-5.6, 2.1, 2.3, 7.8, 8.9}
    4 | {-26.85334, 153.1514}
    5 | {-5.6, 2.1, 2.3, 7.8, 8.9}
    1 | {-26.85334, 152.99692}

    (6 rows)

    cqlsh:test>
    cqlsh:test> select * from test.t3 ;

    id | val1
    ----+----------------------------
    6 | [8.9, 2.3, -5.6, 7.8, 2.3]
    3 | [8.9, 2.3, -5.6, 7.8, 2.3]
    2 | [8.9, 2.3, -5.6, 7.8, 2.1]
    4 | [153.1514, -26.85334]
    5 | [8.9, 2.3, -5.6, 7.8, 2.1]
    1 | [152.99692, -26.85334]

    (6 rows)

  5. #5
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Pour finir, on va traiter du sujet des collections imbriquées.

    Pour cela je me suis créé le jeu de données suivant :

    id;val1
    1;[[152.99691968, -26.853342008], [12.1, -25.6, -34.73, 69.1, 45.6], [153.151394048, -26.853342008], [153.151394048, -26.359622999], [152.99691968, -26.359622999]]
    On a donc une collection de type LIST, chaque élément étant aussi une collection de type LIST.

    Si j'essaie de créer une table avec la colonne VAL1 qui est de type LIST de LIST, cela ne marche pas car Cassandra ne gère pas de collections imbriquées :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cqlsh:test> create table test.t4 (
            ...   id   smallint,
            ...   val1 <list<list<float>>>,
            ...   primary key (id)
            ... ) ;
     
    SyntaxException: line 3:7 no viable alternative at input '<' (... (  id   smallint,  val1 [<]...)

    Pour pouvoir imbriquer des collections, il faut utiliser le mot clé FROZEN. Cela signifie que Cassandra va gérer les éléments de la collection de plus haut niveau, et que par contre, chacun de ces éléments ne sera pas géré comme une sous-collection, mais comme un ensemble de données formant un tout.

    Ce sera donc à l'applicatif, et non pas à la base de données, de savoir gérer, décoder et interpréter chaque élément, comme le second élément [12.1, -25.6, -34.73, 69.1, 45.6] qui est une collections de 6 nombres :

    create table test.t4 (
    id smallint,
    val1 frozen<list<list<float>>>,
    primary key (id)
    ) ;

    copy test.t4 from 'f:\t4.csv' with header=true and delimiter=';' ;

    cqlsh:test> select * from test.t4 ;

    id | val1
    ----+-----------------------------------------------------------------------------------------------------------------------------------
    1 | [[152.99692, -26.85334], [12.1, -25.6, -34.73, 69.1, 45.6], [153.1514, -26.85334], [153.1514, -26.35962], [152.99692, -26.35962]]

    (1 rows)


Discussions similaires

  1. stocker des données dans une base sqlserve
    Par Halloula dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/02/2008, 18h59
  2. Réponses: 4
    Dernier message: 17/01/2007, 09h09
  3. Stocker / Extraire des fichiers dans une base Access
    Par bryan_fury75 dans le forum Bases de données
    Réponses: 5
    Dernier message: 14/06/2006, 15h17
  4. [VB6]problème d'insertion des donneés dans une base d'Access2003
    Par lanbok dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/05/2006, 12h17
  5. [MySQL] Modifier des données dans une base de donnée
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/01/2006, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo