Difference between revisions of "Cholera MapReduce Application"

From CSE231 Wiki
Jump to navigation Jump to search
Line 37: Line 37:
  
 
=Code To Implement=
 
=Code To Implement=
In order to provide a more open-ended assignment, we have abstracted out different aspects of the studio. Of particular note is <code>getValueRepresentation()</code> which allows you to specify whether high or low numbers are suspect. That is: if you return <code>CholeraAppValueRepresentation.HIGH_NUMBERS_SUSPECT</code> you are indicating that a higher number is more likely to indicate that the water pump is the source of the cholera outbreak.  This will aid the [[#Visualization]] in presenting your findings. We have anticipated two basic approaches to this problem (with a variation^2 on one of the approaches). If you take a different approach than one we have anticipated, that is fine.  Get it checked out by an instructor.
+
In order to provide a more open-ended assignment, we have abstracted out different aspects of the studio. In particular, <code>getValueRepresentation()</code> allows you to specify whether your CholeraApp sees high or low numbers as suspects. For example, if you return <code>ValueRepresentation.HIGH_NUMBERS_SUSPECT</code>, you are indicating that a higher number is more likely to indicate that the water pump is the source of the cholera outbreak.  This will aid the [[#Visualization]] in presenting your findings.  
 +
 
 +
We have anticipated two basic approaches to this problem (with a variation^2 on one of the approaches). You may choose to implement an integer-based or a double-based CholeraApp. If you take a different approach than one we have anticipated, that is fine.  Get it checked out by an instructor.
  
 
==CholeraUtils==
 
==CholeraUtils==
  
 
===createApp===
 
===createApp===
 +
return a new CholeraApp. Depending on which approach you plan to implement, it will be either <code>IntegerCholeraApp()</code> or <code>DoubleCholeraApp()</code>
  
 
==IntegerCholeraApp or DoubleCholeraApp==
 
==IntegerCholeraApp or DoubleCholeraApp==
{{CodeToImplement|IntegerCholeraApp or DoubleCholeraApp|getValueRepresentation<br>createMapper<br>createCollector|mapreduce.apps.cholera.studio}}
+
{{CodeToImplement|IntegerCholeraApp or DoubleCholeraApp|getValueRepresentation<br>createMapper<br>createCollector|mapreduce.apps.cholera.exercise}}
  
 
===getValueRepresentation===
 
===getValueRepresentation===
 
{{Sequential|public static ValueRepresentation getValueRepresentation()}}
 
{{Sequential|public static ValueRepresentation getValueRepresentation()}}
  
return one of the three values to aid the visualization and testing:
+
return one of the three values of the [https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html enum] <code>ValueRepresentation</code> to aid the visualization and testing. You can access the specific enum constant by typing <code> ValueRepresentation. </code>
  
 
  <nowiki>public enum ValueRepresentation {
 
  <nowiki>public enum ValueRepresentation {
Line 58: Line 61:
 
{{Sequential|public static Mapper<CholeraDeath, WaterPump, Number> createMapper()}}
 
{{Sequential|public static Mapper<CholeraDeath, WaterPump, Number> createMapper()}}
  
We have implemented WaterPump as an enum.  You can access the enum constants of any enum [https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html via its values() method]. For example:
+
We have implemented WaterPump as an enum.  You can access all the enum constants of any enum [https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html via its values() method]. For example:
  
 
  <nowiki>for (WaterPump pump : WaterPump.values()) {
 
  <nowiki>for (WaterPump pump : WaterPump.values()) {
 
}</nowiki>
 
}</nowiki>
  
===createCollector===
+
If you need inspirations on how to implement a Mapper, revisit past assignments such as [https://classes.engineering.wustl.edu/cse231/core/index.php?title=Int_Sum_MapReduce_Apps_Studio#Card_Mapper CardMapper and WordCountMapper], which implements the Mapper<E, K, V> interface. Or you can directly tunnel into the Mapper<E, K, V> interface to see what method you need to implement.
Depending on your approach, you may be able to reuse one of your existing Collectors.  Otherwise, implement one to go with your Mapper.
+
 
 +
===createReducer===
 +
Depending on your approach, you may be able to reuse one of your existing Reducers.  Otherwise, implement one to go with your Mapper.
  
{{Sequential|public static Collector<? extends Number, ?, ? extends Number> createCollector()}}
+
{{Sequential|public static Reducer<? extends Number, ?, ? extends Number> createReducer()}}
  
note: if you decide to build your own Collector, the following will likely be a fine charateristics method
+
note: if you decide to build your own Reducer, the following will likely be a fine charateristics method
  
 
  <nowiki> @Override
 
  <nowiki> @Override

Revision as of 20:33, 22 March 2022

John Snow memorial and pub.jpg

Motivation

Epidemiology is the important study of "why certain people are getting ill."

We get a chance to make sense of the data in a relatively open-ended studio.

Background

Imagine you are a physician in 1854 London in the midst of a cholera outbreak. Your theory that contaminated water is the cause meets resistance from the medical establishment which holds that it is spread via the air.

Imagine further that your friend Ada has left you access to computing.

Code To Use

We have made the data from this GIS Analysis available via methods:

class Location

double getDistanceTo( Location other )

class CholeraDeath

Location getLocation()

enum WaterPump

Location getLocation()

class SohoCholeraOutbreak1854

static CholeraDeath[] getDeaths()

Code To Implement

In order to provide a more open-ended assignment, we have abstracted out different aspects of the studio. In particular, getValueRepresentation() allows you to specify whether your CholeraApp sees high or low numbers as suspects. For example, if you return ValueRepresentation.HIGH_NUMBERS_SUSPECT, you are indicating that a higher number is more likely to indicate that the water pump is the source of the cholera outbreak. This will aid the #Visualization in presenting your findings.

We have anticipated two basic approaches to this problem (with a variation^2 on one of the approaches). You may choose to implement an integer-based or a double-based CholeraApp. If you take a different approach than one we have anticipated, that is fine. Get it checked out by an instructor.

CholeraUtils

createApp

return a new CholeraApp. Depending on which approach you plan to implement, it will be either IntegerCholeraApp() or DoubleCholeraApp()

IntegerCholeraApp or DoubleCholeraApp

class: IntegerCholeraApp or DoubleCholeraApp.java Java.png
methods: getValueRepresentation
createMapper
createCollector
package: mapreduce.apps.cholera.exercise
source folder: student/src/main/java

getValueRepresentation

method: public static ValueRepresentation getValueRepresentation() Sequential.svg (sequential implementation only)

return one of the three values of the enum ValueRepresentation to aid the visualization and testing. You can access the specific enum constant by typing ValueRepresentation.

public enum ValueRepresentation {
	HIGH_NUMBERS_SUSPECT, LOW_NUMBERS_SUSPECT, LOW_NUMBERS_SUSPECT_SQUARED
}

createMapper

method: public static Mapper<CholeraDeath, WaterPump, Number> createMapper() Sequential.svg (sequential implementation only)

We have implemented WaterPump as an enum. You can access all the enum constants of any enum via its values() method. For example:

for (WaterPump pump : WaterPump.values()) {
}

If you need inspirations on how to implement a Mapper, revisit past assignments such as CardMapper and WordCountMapper, which implements the Mapper<E, K, V> interface. Or you can directly tunnel into the Mapper<E, K, V> interface to see what method you need to implement.

createReducer

Depending on your approach, you may be able to reuse one of your existing Reducers. Otherwise, implement one to go with your Mapper.

method: public static Reducer<? extends Number, ?, ? extends Number> createReducer() Sequential.svg (sequential implementation only)

note: if you decide to build your own Reducer, the following will likely be a fine charateristics method

	@Override
	public Set<Characteristics> characteristics() {
		return EnumSet.noneOf(Characteristics.class);
	}

OPTIONAL getThresholdIfApplicable

We have noted that some students have been going with a threshold approach. In order to support this in the visualization and the test (and to minimize the chances of interfering with students who have already started) we have added a separate class file CholeraThreshold. You need not concern yourself with this file if you are going with a threshold-less strategy.

class: CholeraApp.java Java.png
methods: getThresholdIfApplicable
package: mapreduce.apps.cholera.studio
source folder: student/src/main/java

method: public static double getThresholdIfApplicable() Sequential.svg (sequential implementation only)

Return the threshold if you are using one in your Mapper. Otherwise return Double.NaN.

	public static double getThresholdIfApplicable() {
		final boolean IS_THRESHOLD_APPLICABLE = false;
		if (IS_THRESHOLD_APPLICABLE) {
			throw new NotYetImplementedException();
		} else {
			return Double.NaN;
		}
	}

Testing Your Solution

Visualization

Original Map Drawn By John Snow:

Snow-cholera-map-1.jpg

Our Visualization App:

class: CholeraOutbreakVisualizationApp.java VIZ
package: mapreduce.apps.cholera.viz
source folder: student/src//java

CholeraOutbreak.png

Correctness

If you have chosen to go a different route than the ones we anticipated, do not worry about passing the test suite. Demo your work to an instructor in class and we can discuss its fitness.

class: CholeraStudioTestSuite.java Junit.png
package: mapreduce
source folder: testing/src/test/java