Blog de la Comunidad de PHD 2014 Consultores - Big Data e Inteligencia de Negocios.

www.phd2014consultores.com

martes, 20 de mayo de 2014

Mini Proyecto de Playlist, Parte 2


Ejercicio #1: Crear un Keyspace y tablas para la aplicación Playlist

  1. Iniciamos Cassandra y nos conectamos usando CQL shell.

  2. Creamos un Keyspace llamado “playlist”. Tenemos que usar un factor de replicación de 1.

cqlsh> create keyspace playlist with replication = {'class': 'SimpleStrategy', 'replication_factor': 1};

  1. Establecemos como predeterminado este Keyspace para esta sesión.

cqlsh> use playlist;
cqlsh:playlist>




Ejercicio #2: Crear y Cargar la tabla Artist

  1. Recordemos que tenemos una tabla en la que podemos buscar por la primera letra de un artista. Vamos a crear una tabla con sólo 2 columnas, la primera letra y el nombre del artista. El nombre del artista es único, así que éste será nuestra clave primaria (primary key).

cqlsh:playlist> create table artists_by_first_letter (first_letter text, artist text, primary key (first_letter, artist));



La clave primaria - primary key - compuesta nos permitirá hacer consultas por la primera letra.


  1. Ahora vamos a cargar los datos. Primero descomprimimos el archivo "session2.zip". En él encontraremos un directorio llamado también “session2” que contiene un archivo de artistas (nombre y primera letra). El delimitador es el caracter “|”. Se puede encontrar en el directorio “session2/scripts/”. Cargue este archivo en la nueva tabla con el comando COPY. Asegúrese de poner la ruta correcta al archivo.

cqlsh:playlist> copy artists_by_first_letter (first_letter, artist) from '/home/<nombre_usuario>/Desktop/Laboratorios/session2/scripts/artists.csv' with delimiter = '|';
3605 rows imported in 7.892 seconds.

  1. Ejecutamos algunas consultas sobre la tabla para verificar que se ha cargado la data correctamente:

cqlsh:playlist> select * from artists_by_first_letter limit 5;

 first_letter | artist
--------------+---------------------------------
            C |                  C.W. Stoneking
            C |                            CH2K
            C | CHARLIE HUNTER WITH LEON PARKER
            C |                   Calvin Harris
            C |                          Camané

(5 rows)

Podemos notar que la columna “first_letter” no está ordenada alfabéticamente, pero la columna “artist” está agrupada por la clave primaria.


Ejercicio #3: Iniciar la aplicación en Eclipse y ver los Artistas.

1. Abrimos Eclipse e importamos el Proyecto de la misma manera que se hizo en la sesión 1. 


Podemos ejecutar o hacer "Debug" de la aplicación como una aplicación Java (Java Aplication). Debemos elegir la clase StartJetty como la clase principal.



2. Visitamos la dirección http://localhost:8080/playlist. Hacemos click en “VISIT THE SONG DATABASE”. Luego hacemos click en cualquier letra para ver los artistas cuyo nombre comienza por esa letra.




3. Si hacemos click en cualquiera de los enlaces de género no se obtendrá ninguna canción. Vamos a añadir esa funcionalidad en los ejercicios posteriores.





Ejercicio #4: Crear y Cargar la tabla track_by_artist.

  1. Creamos una tabla denominada “track_by_artist”.

cqlsh:playlist> create table track_by_artist (track text, artist text, track_id UUID, track_length_in_seconds int, genre text, music_file text, primary key (artist));

  1. Importamos los datos:

cqlsh:playlist> copy track_by_artist (track_id, genre, artist, track, track_length_in_seconds, music_file) from '/home/<nombre_usuario>/Escritorio/Laboratorios/session2/scripts/songs.csv' with delimiter ='|' and header=true;
59600 rows imported in 1 minute and 12.824 seconds.



Ejercicio #5: Implementar un Prepared Select statement.


Hacemos click en la opción “VISIT THE SONG DATABASE”, haga click en 'P' y luego seleccione 'Pagan's Mind'. Esto causa una CQLException.




   La última línea de la excepción muestra que estamos en una clase llamada TracksDAO en el método listSongByArtist, antes de hacer una llamada al Driver DataStax Java. Esta es la clase del modelo que se encarga de recuperar la información de los tracks desde Cassandra.

Veamos ese archivo en Eclipse:





Modifiquemos las siguientes líneas:


String queryText = "SELECT * FROM track_by_artist WHERE artist = '" + artist + "'";
ResultSet results = getSession().execute(queryText);


Por:

PreparedStatement statement = getSession().prepare(
                                      "SELECT * FROM track_by_artist "
                                      + "WHERE artist = ?");
BoundStatement boundStatement = new BoundStatement(statement);
ResultSet results = getSession().execute(boundStatement.bind(artist ) );


El código completo queda:

public static List<TracksDAO> listSongsByArtist(String artist) {

    // TODO - This bombs if the artist name contains a single-quote.
    // TODO - Replace the next two lines of this method
    // TODO - with code which uses a prepared statement and bound statement

    //String queryText = "SELECT * FROM track_by_artist WHERE artist = '" + artist + "'";
    //ResultSet results = getSession().execute(queryText);
                PreparedStatement statement = getSession().prepare("SELECT * FROM track_by_artist WHERE artist = ?");
                BoundStatement boundStatement = new BoundStatement(statement);
                ResultSet results = getSession().execute(boundStatement.bind(artist));
               

    // TODO - Done replacing code

    List<TracksDAO> tracks = new ArrayList<>();

    for (Row row : results) {
      tracks.add(new TracksDAO(row));
    }

    return tracks;
  }


Reiniciamos la aplicación, ahora ya podemos hacer click en los artistas que tienen comilla simple en su nombre.


Ejercicio #6: Consultando por Género.

  1. Para consultar por género tendremos que crear una nueva tabla y cargar los datos:

cqlsh:playlist> create table track_by_genre (track text, artist text, track_id UUID, track_length_in_seconds int, genre text, music_file text, primary key (genre));


cqlsh:playlist> copy track_by_genre (track_id, genre, artist, track, track_length_in_seconds, music_file) from '/home/<nombre_usuario>/Escritorio/Laboratorios/session2/scripts/songs.csv' with delimiter ='|' and header=true;
59600 rows imported in 1 minute and 12.824 seconds.


  1. Ahora modificamos el método listSongByGenre() de la clase TracksDAO.
    El método debería verse así:

public static List<TracksDAO> listSongsByGenre(String genre) {

    ResultSet results = null;
   
    List<TracksDAO> tracks = new ArrayList<>();

    // TODO - implement the code here to retrieve the songs by genre in the "results" variable
    PreparedStatement statement = getSession().prepare("SELECT * FROM track_by_genre WHERE genre = ?");
                BoundStatement boundStatement = new BoundStatement(statement);
                results = getSession().execute(boundStatement.bind(genre));
               
   
   
    if (results != null) {
      for (Row row : results) {
        tracks.add(new TracksDAO(row));
      }
    }

    return tracks;
  }


Reiniciamos la aplicación, ya se puede visualizar las canciones por un género en particular.




 Ejercicio #7: Consultando por Género.

En este ejercicio vamos a ver como se utilizan los UUID como identificadores únicos para las canciones de la próxima sesión.

Cada canción tiene un track_id único que es de tipo UUID. Cada vez que creamos una nueva pista, tenemos que generar un nuevo UUID para el track_id. Esto se hace en el constructor del objeto TracksDAO.


public TracksDAO(String artist, String track, String genre, String music_file, int track_length_in_seconds) {
    this.track_id = UUID.randomUUID();  // We can generate the new UUID right here in the constructor
    this.artist = artist;
    this.track = track;
    this.genre = genre;
    this.music_file = music_file;
    this.track_length_in_seconds = track_length_in_seconds;
  }

Debemos notar que hay un constructor adicional a partir de una fila encontrada en Cassandra. No necesitamos generar un UUID, pues ya lo tenemos de la fila encontrada.

1.      Hacemos click en el link “Añadir Song” y agregamos una nueva canción. Luego hacemos click en el enlace de Género para el género de la canción que acabamos de agregar y validamos que esté en la lista. Si no está en la lista hay que examinar el método TraksDAO.add() y hacer los cambios pertinentes.

Nota: el método TraksDAO.add() solo insertará en la tabla track_by_artist, se puede hacer modificaciones para agregar también en la tabla track_by_genre (esto último sería lo ideal).

Solo hace falta agregar las siguientes líneas:

preparedStatement = getSession().prepare("INSERT INTO track_by_genre (genre, track_id, artist, track, track_length_in_seconds) VALUES (?, ?, ?, ?, ?)");
    boundStatement = preparedStatement.bind(this.genre, this.track_id, this.artist, this.track, this.track_length_in_seconds);
    getSession().execute(boundStatement);








No hay comentarios:

Publicar un comentario