著者:chen_h
マイクロ・シグナル&QQ:862251340
マイクロチャネル公共数:coderpai
クリーニングの実験データ:FLINKラーニング(II)
データ準備
まず、次のアドレスをダウンロードし、必要な試験データをダウンロードする必要があります。
wget http://training.ververica.com/trainingData/nycTaxiRides.gz
wget http://training.ververica.com/trainingData/nycTaxiFares.gz
私達はちょうど解凍する必要はありません、データを取得する必要があります。
タクシー形式のデータ
私たちのタクシーデータセット(タクシーライド)、様々なニューヨーク市のタクシー旅行に関する情報が含まれています。二つの事象により、各旅行は、言った:旅は、イベントを開始し、旅の終わり。各イベントは11個のフィールドがあります。
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
注:無効または欠落したデータセットに含まれるレコード情報(緯度と経度、0.0)座標。
付属タクシー料金(タクシー運賃)データの関連データ・セットもあり、これらのフィールドが含まれます:
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
プログラムで、タクシーでのデータストリームを生成FLINK
注:これらの演習は、これらのタクシー・データ・ストリームを使用するコードを提供しています。
私たちは、FLINKソース機能(TaxiRideSource)を提供し、機能はタクシーのレコードと問題タクシーライドイベント・ストリームと.gzというファイルを読み込みます。ソース関数は、イベントの時間を実行しています。TaxiFareイベントは、同様のソース関数(TaxiFareSource)を有しています。
変更ExerciseBaseファイル
あなたのIDEでのデータセット、オープンcom.ververica.flinktraining.exercises.datastream_java.utils.ExerciseBaseクラスをダウンロードしたら、その後、次の2行にポイントへの2台のタクシーのデータファイルを編集するには、ダウンロードしました:
pathToRideData = "YOUR DATA PATH";
pathToFareData = "YOUR DATA PATH";
実験的な要件
運動の「タクシーに乗るのデータクレンジング」タスクは、タクシーライドイベントストリームをクリーンアップするイベントの開始や終了を削除することにより、ニューヨークではありません。
GeoUtilsユーティリティクラスは、ニューヨークエリアに位置するかどうかを確認するために、静的メソッドisInNYC(フロートLON、フロートLAT)を提供します。
それはこれに沸きます:
- スクリーニングおよびニューヨークのすべてのタクシーデータの発信を終了します。
- ニューヨークのかどうかを判断するために提供していGeoUtils。
- 非常に単純なフィルタ
データ入力:
// 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));
データ出力
ニューヨークの開始点は、コンソールに期待される出力データではありません。
完全なコード:
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);
}
}
}
私達はちょうどプログラムのフィルタ機能を変更しました:
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);
}
}