Flink apprentissage (II): Les données expérimentales d'un nettoyage

Auteur: chen_h
Micro Signal & QQ: 862251340
micro-canal numéro public: coderpai


Flink Learning (a): Cette section décrit le flux

Flink apprentissage (II): Les données expérimentales d'un nettoyage


Préparation des données

D'abord, nous devons télécharger les données de test requis, téléchargez l'adresse suivante:

wget http://training.ververica.com/trainingData/nycTaxiRides.gz
wget http://training.ververica.com/trainingData/nycTaxiFares.gz

Nous avons juste besoin d'obtenir les données, ne doivent pas nécessairement être décompressé.

données de format de taxi

Notre jeu de données de taxi (Taxiride) contient des informations sur les différents New York City Voyage en taxi. Chaque voyage par deux événements, a déclaré: début voyage et à la fin du voyage de l'événement. Chaque événement contient 11 champs:

rideId         : Long      // a unique id for each ride
taxiId         : Long      // a unique id for each taxi
driverId       : Long      // a unique id for each driver
isStart        : Boolean   // TRUE for ride start events, FALSE for ride end events
startTime      : DateTime  // the start time of a ride
endTime        : DateTime  // the end time of a ride,
                           //   "1970-01-01 00:00:00" for start events
startLon       : Float     // the longitude of the ride start location
startLat       : Float     // the latitude of the ride start location
endLon         : Float     // the longitude of the ride end location
endLat         : Float     // the latitude of the ride end location
passengerCnt   : Short     // number of passengers on the ride

Note: L'ensemble de données contient des enregistrements non valides ou manquantes des informations de coordonnées (latitude et longitude, 0.0).

Il y a aussi un tarif de taxi inclus (tarif taxi) ensembles de données connexes de données, ces domaines comprennent:

rideId         : Long      // a unique id for each ride
taxiId         : Long      // a unique id for each taxi
driverId       : Long      // a unique id for each driver
startTime      : DateTime  // the start time of a ride
paymentType    : String    // CSH or CRD
tip            : Float     // tip for this ride
tolls          : Float     // tolls for this ride
totalFare      : Float     // total fare collected

La génération d'un flux de données dans un taxi avec un programme Flink

Note: Ces exercices ont fourni le code à utiliser ces flux de données de taxis.

Nous fournissons la fonction source Flink (TaxiRideSource), la fonction lit le fichier .gz avec des enregistrements de taxi et numéro flux d'événements Taxiride. Source Fonction durée de l'événement. événement TaxiFare a une fonction source similaire (TaxiFareSource).

Modifier le fichier ExerciseBase

Après avoir téléchargé le jeu de données, classe com.ververica.flinktraining.exercises.datastream_java.utils.ExerciseBase ouvert dans votre IDE, puis modifiez les deux fichiers de données de taxi pour pointer vers ces deux lignes téléchargé:

pathToRideData = "YOUR DATA PATH";
pathToFareData = "YOUR DATA PATH";

exigences expérimentales

« Nettoyage des données de trajet en taxi » tâche de l'exercice n'est pas à New York en supprimant le début ou la fin de l'événement pour nettoyer flux d'événements Taxiride.

GeoUtils classe utilitaire fournit une méthode statique isInNYC (lon de flotteur, le flotteur lat), pour vérifier si un emplacement dans la région de New York.

Il se résume à ceci:

  1. Projeté et mettre fin à toutes les données de taxi originaires de New York.
  2. GeoUtils qui prévoit de déterminer si, à New York.
  3. Un filtre très simple

Entrée de données:

// get an ExecutionEnvironment
StreamExecutionEnvironment env =
  StreamExecutionEnvironment.getExecutionEnvironment();
// configure event-time processing
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

// get the taxi ride data stream
DataStream<TaxiRide> rides = env.addSource(
  new TaxiRideSource("/Users/XXX/Resources/2018/trainingData/nycTaxiRides.gz", maxDelay, servingSpeed));

sortie de données

Le point de départ de New York est pas dans les données de sortie attendues à la console.

Code complet:

package com.dataartisans.flinktraining.exercises.datastream_java.basics;

import com.dataartisans.flinktraining.exercises.datastream_java.datatypes.TaxiRide;
import com.dataartisans.flinktraining.exercises.datastream_java.sources.TaxiRideSource;
import com.dataartisans.flinktraining.exercises.datastream_java.utils.ExerciseBase;
import com.dataartisans.flinktraining.exercises.datastream_java.utils.GeoUtils;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * The "Ride Cleansing" exercise from the Flink training
 * (http://training.data-artisans.com).
 * The task of the exercise is to filter a data stream of taxi ride records to keep only rides that
 * start and end within New York City. The resulting stream should be printed.
 * <p>
 * Parameters:
 * -input path-to-input-file
 */
public class RideCleansingExercise extends ExerciseBase {
    public static void main(String[] args) throws Exception {

        ParameterTool params = ParameterTool.fromArgs(args);
        final String input = params.get("input", ExerciseBase.pathToRideData);

        final int maxEventDelay = 60;       // events are out of order by max 60 seconds
        final int servingSpeedFactor = 600; // events of 10 minutes are served in 1 second

        // set up streaming execution environment
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
        env.setParallelism(ExerciseBase.parallelism);

        // start the data generator
        DataStream<TaxiRide> rides = env.addSource(rideSourceOrTest(new TaxiRideSource(input, maxEventDelay, servingSpeedFactor)));

        DataStream<TaxiRide> filteredRides = rides
                // filter out rides that do not start or stop in NYC
                .filter(new NYCFilter());

        // print the filtered stream
        printOrTest(filteredRides);

        // run the cleansing pipeline
        env.execute("Taxi Ride Cleansing");
    }

    private static class NYCFilter implements FilterFunction<TaxiRide> {

        @Override
        public boolean filter(TaxiRide taxiRide) throws Exception {
            // 起点和终点都在纽约
            return GeoUtils.isInNYC(taxiRide.startLon, taxiRide.startLat) && GeoUtils.isInNYC(taxiRide.endLon, taxiRide.endLat);
        }
    }

}

Nous venons de la fonction modifié le filtre de programme:

private static class NYCFilter implements FilterFunction<TaxiRide> {

        @Override
        public boolean filter(TaxiRide taxiRide) throws Exception {
            // 起点和终点都在纽约
            return GeoUtils.isInNYC(taxiRide.startLon, taxiRide.startLat) && GeoUtils.isInNYC(taxiRide.endLon, taxiRide.endLat);
        }
    }
Publié 414 articles originaux · Praise gagné 168 · vues 470 000 +

Je suppose que tu aimes

Origine blog.csdn.net/CoderPai/article/details/104898891
conseillé
Classement