From cf8fef4b3ab9c91760d5c71846ece38050b64631 Mon Sep 17 00:00:00 2001 From: Max O'Cull Date: Sat, 20 Apr 2019 20:23:11 -0400 Subject: [PATCH] Query 1 init --- p4/.classpath | 49 ++++++++++++++++++ p4/.project | 23 ++++++++ p4/.settings/org.eclipse.jdt.apt.core.prefs | 2 + p4/.settings/org.eclipse.jdt.core.prefs | 9 ++++ p4/.settings/org.eclipse.m2e.core.prefs | 4 ++ p4/Makefile | 15 ++++++ p4/src/main/java/cs448/Project4.java | 47 +++++++++++++++++ p4/target/maven-archiver/pom.properties | 4 ++ .../compile/default-compile/createdFiles.lst | 7 +++ .../compile/default-compile/inputFiles.lst | 6 +++ .../default-testCompile/inputFiles.lst | 0 p4/target/p4-1.0-SNAPSHOT.jar | Bin 0 -> 14378 bytes 12 files changed, 166 insertions(+) create mode 100644 p4/.classpath create mode 100644 p4/.project create mode 100644 p4/.settings/org.eclipse.jdt.apt.core.prefs create mode 100644 p4/.settings/org.eclipse.jdt.core.prefs create mode 100644 p4/.settings/org.eclipse.m2e.core.prefs create mode 100644 p4/Makefile create mode 100644 p4/target/maven-archiver/pom.properties create mode 100644 p4/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 p4/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 p4/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 p4/target/p4-1.0-SNAPSHOT.jar diff --git a/p4/.classpath b/p4/.classpath new file mode 100644 index 0000000..39abf1c --- /dev/null +++ b/p4/.classpath @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/p4/.project b/p4/.project new file mode 100644 index 0000000..fc4eb90 --- /dev/null +++ b/p4/.project @@ -0,0 +1,23 @@ + + + p4 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/p4/.settings/org.eclipse.jdt.apt.core.prefs b/p4/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/p4/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/p4/.settings/org.eclipse.jdt.core.prefs b/p4/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..1b6e1ef --- /dev/null +++ b/p4/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/p4/.settings/org.eclipse.m2e.core.prefs b/p4/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/p4/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/p4/Makefile b/p4/Makefile new file mode 100644 index 0000000..1035657 --- /dev/null +++ b/p4/Makefile @@ -0,0 +1,15 @@ +.PHONY=clean build submit + +all: package submit + +clean: + mvn clean + +build: + mvn package + +submit: + spark-submit --class cs448.App target/p4-1.0-SNAPSHOT.jar -i "/user/mocull/input" + +warmup: + spark-submit --class cs448.App target/p4-1.0-SNAPSHOT.jar -i "/user/mocull/input" -warmup diff --git a/p4/src/main/java/cs448/Project4.java b/p4/src/main/java/cs448/Project4.java index 3b46cc1..04853fe 100644 --- a/p4/src/main/java/cs448/Project4.java +++ b/p4/src/main/java/cs448/Project4.java @@ -1,5 +1,25 @@ package cs448; +import org.apache.commons.cli.*; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.spark.api.java.JavaPairRDD; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.Optional; +import org.apache.spark.api.java.function.Function; +import org.apache.spark.api.java.function.Function2; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; +import scala.Tuple2; +import scala.Tuple4; + +import java.io.IOException; +import java.io.Serializable; +import java.util.List; + public class Project4 { public void runSparkApp1(App.Conf conf){ System.out.println("Running Your First Spark App!"); @@ -8,10 +28,37 @@ public class Project4 { */ // Create a Spark Session. + SparkSession spark = SparkSession.builder().appName("CS 448 Project 4 -- Query 1").getOrCreate(); // Write data processing code here + String dataFiles[] = {conf.usersFName, conf.moviesFName, conf.ratingsFName}; + Dataset data; + + //// Reading, Parsing and counting lines for each of the data files + JavaRDD userRDD = spark.read().textFile(CS448Utils.resolveUri(conf.inPath,conf.usersFName)).cache() + .javaRDD() + .map(User::parseUser); + Dataset userDF = spark.createDataFrame(userRDD, User.class); + userDF.createOrReplaceTempView("User"); + + JavaRDD movieRDD = spark.read().textFile(CS448Utils.resolveUri(conf.inPath,conf.moviesFName)).cache() + .javaRDD() + .map(Movie::parseMovie); + Dataset movieDF = spark.createDataFrame(movieRDD, Movie.class); + movieDF.createOrReplaceTempView("Movie"); + + JavaRDD ratingRDD = spark.read().textFile(CS448Utils.resolveUri(conf.inPath,conf.ratingsFName)).cache() + .javaRDD() + .map(Rating::parseRating); + Dataset ratingDF = spark.createDataFrame(ratingRDD, Rating.class); + ratingDF.createOrReplaceTempView("Rating"); + + Dataset resultDF = spark.sql("SELECT DISTINCT m.title FROM Movie m, Rating r, User u WHERE m.movieId = r.movieId AND r.userId = u.userId AND u.occupation = " + + conf.q1Occupation + " AND r.rating >= " + conf.q1Rating); + resultDF.show(); //Don't forget to stop spark session + spark.stop(); } public void runSparkApp2(App.Conf conf){ diff --git a/p4/target/maven-archiver/pom.properties b/p4/target/maven-archiver/pom.properties new file mode 100644 index 0000000..03873ea --- /dev/null +++ b/p4/target/maven-archiver/pom.properties @@ -0,0 +1,4 @@ +#Created by Apache Maven 3.6.0 +version=1.0-SNAPSHOT +groupId=cs448 +artifactId=p4 diff --git a/p4/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/p4/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..b95557e --- /dev/null +++ b/p4/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,7 @@ +cs448/User.class +cs448/Rating.class +cs448/App$Conf.class +cs448/App.class +cs448/Project4.class +cs448/CS448Utils.class +cs448/Movie.class diff --git a/p4/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/p4/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..b8af298 --- /dev/null +++ b/p4/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +/home/max/src/cs448/p4/src/main/java/cs448/Rating.java +/home/max/src/cs448/p4/src/main/java/cs448/Movie.java +/home/max/src/cs448/p4/src/main/java/cs448/CS448Utils.java +/home/max/src/cs448/p4/src/main/java/cs448/User.java +/home/max/src/cs448/p4/src/main/java/cs448/App.java +/home/max/src/cs448/p4/src/main/java/cs448/Project4.java diff --git a/p4/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/p4/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/p4/target/p4-1.0-SNAPSHOT.jar b/p4/target/p4-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..4b7e749613ceadec13880c0df30f7e8b30ac14d5 GIT binary patch literal 14378 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 E5AHj~%m4rY literal 0 HcmV?d00001