The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".
The following errata were submitted by our customers and approved as valid errors by the author or editor.
| Version |
Location |
Description |
Submitted By |
Date submitted |
Date corrected |
|
http://techbus.safaribooksonline.com/9781449359034/subsec_passing_functions_html#example3-21
Example 3-21 |
In Example 3-21, return types for the getMatches* methods are incorrect. getMatchesFunctionReference() should return RDD[Boolean], and getMatchesFieldReference() and getMatchesNoReference() should either return RDD[Array[String]] or change the implementation to use flatMap instead of map.
Note from the Author or Editor: I've updated the return types, thanks for catching this.
|
Anonymous |
Feb 19, 2015 |
Mar 27, 2015 |
|
ex6-16
example 6-16, code |
The R library Imap function gdist takes as the first four arguments longitude, latitude, longitude, and latitude. The calling code writes values to stdout in the wrong order (latitude, longitude, ...). This order is not corrected in the R code that passes them to gdist.
Examples 6-17 and 6-18 have the same bug.
Note from the Author or Editor: That's correct, I've fixed this in 6-17/18 in atlas.
|
Waclaw Kusnierczyk |
Jul 09, 2015 |
|
| PDF |
Page vii
2nd parapgraph |
duplicated wording
READ:
"You’ll learn how to learn how to download..."
SHOULD READ:
"You’ll learn how to download..."
Note from the Author or Editor: Fixed in fe6dc3e1dd493a83464e115a4309ab806cf240cb
|
Ricardo Almeida |
Oct 08, 2014 |
Jan 26, 2015 |
| PDF |
Page 9, 10
P9 - Downloading Spark: P1; P10 - 1st paragraph after the notes |
Page 9 has the following text:
This will download a compressed tar
file, or “tarball,” called spark-1.1.0-bin-hadoop1.tgz .
On page 10, a different tarball is referenced:
cd ~
tar -xf spark-1.1.0-bin-hadoop2.tgz
cd spark-1.1.0-bin-hadoop2
|
Kevin D'Elia |
Oct 20, 2014 |
Jan 26, 2015 |
| PDF |
Page 20
Fifth line from the bottom. |
"Example 2-13. Maven build file" is invalid because there is an extra </plugin> closing tag.
Bad: </configuration> </plugin> </plugin>
Better: </configuration> </plugin>
Note from the Author or Editor: Removed extra plugin tag (done by author).
|
Michah Lerner |
Feb 02, 2015 |
Mar 27, 2015 |
| PDF |
Page 20
Example 2-13. maven build example |
Is there any reason why Akka repo is needed to build the mini project? It seems like all dependencies of spark-core_2.10:1.1.0 are already available in the maven central.
Note from the Author or Editor: I have removed the aka repo from our mini example.
|
Uladzimir Makaranka |
Sep 21, 2014 |
Jan 26, 2015 |
| PDF |
Page 20
Example 2-13 |
<artifactId>learning-spark-mini-example/artifactId> is missing closing <
Note from the Author or Editor: Fixed in b99b12fcd3022c298d30f3fcd2b1d88fd7eab57c
|
Kevin D'Elia |
Oct 19, 2014 |
Jan 26, 2015 |
| PDF |
Page 21
Example 2-15 |
Maven command line executable is called 'mvn'. Please replace "maven clean && maven compile && maven package" with "mvn clean && mvn compile && mvn package".
Also the maven build script (Example 2-13) doesn't compile scala code (i.e. c.o.l.mini.scala), please replace
"$SPARK_HOME/bin/spark-submit --class com.oreilly.learningsparkexamples.mini.scala.WordCount \
./target/learning-spark-mini-example-0.0.1.jar ./README.md ./wordcounts"
with
"$SPARK_HOME/bin/spark-submit --class com.oreilly.learningsparkexamples.mini.java.WordCount \
./target/learning-spark-mini-example-0.0.1.jar ./README.md ./wordcounts"
Note from the Author or Editor: Fixed
|
Uladzimir Makaranka |
Sep 21, 2014 |
Jan 26, 2015 |
| PDF, ePub |
Page 21
Example 2-14 and Example 2-15 |
In order to match with the code in Github:
com.oreilly.learningsparkexamples.mini.Scala.WordCount
should be:
com.oreilly.learningsparkexamples.mini.scala.WordCount
and
com.oreilly.learningsparkexamples.mini.Java.WordCount
should be:
com.oreilly.learningsparkexamples.mini.java.WordCount
Lower case scala and java as paths. Compilation fails otherwise.
Note from the Author or Editor: I've fixed this in the copy edit version we got back.
|
Murali Raju |
Dec 13, 2014 |
Jan 26, 2015 |
| PDF |
Page 25
Example 3-4 |
Small typo in Example 3-4.
READ:
>>> pythonLines.persist
SHOULD READ:
>>> pythonLines.persist()
Note from the Author or Editor: I've added the missing brackets for the dev version.
|
Tatsuo Kawasaki |
May 01, 2015 |
|
| PDF |
Page 29
Example 3-15 |
Python example : Example 3-15
below line return TypeError.
READ:
print "Input had " + badLinesRDD.count() + " concerning lines"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-61-13cf6c82420f> in <module>()
----> 1 print "Input had " + badLinesRDD.count() + " concerning lines"
"TypeError: cannot concatenate 'str' and 'int' objects"
SHOULD READ:
print "Input had %i" % badLinesRDD.count() + " concerning lines"
or
print "Input had " + str(badLinesRDD.count()) + " concerning lines"
Note from the Author or Editor: Thanks, this has been fixed.
|
Tatsuo Kawasaki |
May 01, 2015 |
|
| PDF |
Page 29
Example 3-17 |
No semicolon ends.
READ:
System.out.println("Input had " + badLinesRDD.count() + " concerning lines") System.out.println("Here are 10 examples:")
SHOULD READ:
System.out.println("Input had " + badLinesRDD.count() + " concerning lines"); System.out.println("Here are 10 examples:");
Note from the Author or Editor: Thanks for catching this, I've added in the missing semicolons to example 3-17.
|
Tatsuo Kawasaki |
May 01, 2015 |
|
| Printed |
Page 29
Code example 3-15 |
Greetings, I'm going through "Learning Spark" (3rd release, 1st edition).
Question on the top of top of page 29 of this Python example (example 3-15):
Print "Input had " + badLinesRDD.count() + " concerning lines"
I'm pretty sure this is wrong, because if you try that you get this error...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
... Python won't auto-convert ints to Strings like Java or Scala.
Context just in case I did something wrong in setting things up:
Douglass-MacBook-Pro-2:spark-1.4.1-bin-hadoop2.6 dmeil$ ./bin/pyspark
Python 2.7.10 |Anaconda 2.1.0 (x86_64)| (default, May 28 2015, 17:04:42)
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 1.4.1
/_/
Using Python version 2.7.10 (default, May 28 2015 17:04:42)
SparkContext available as sc, HiveContext available as sqlContext.
Note from the Author or Editor: Thanks for catching this, I've added an explicit str :)
|
Doug Meil |
Jul 28, 2015 |
|
| PDF |
Page 32
1 |
I have been earlier asked by the author to return the book because I reported an issue.
I am therefore not writing this with the intention of it being corrected, but just to let others know that how the code can be run correctly.
The following code does not run:
-----------------------------------------------------------------------------------------------
class SearchFunctions(val query: String) { def isMatch(s: String): Boolean = {
s.contains(query)
}
def getMatchesFunctionReference(rdd: RDD[String]): RDD[String] = {
// Problem: "isMatch" means "this.isMatch", so we pass all of "this”
rdd.map(isMatch)
}
def getMatchesFieldReference(rdd: RDD[String]): RDD[String] = {
// Problem: "query" means "this.query", so we pass all of "this"
rdd.map(x => x.split(query)) }
def getMatchesNoReference(rdd: RDD[String]): RDD[String] = {
// Safe: extract just the field we need into a local variable
val query_ = this.query
rdd.map(x => x.split(query_))
} }
-----------------------------------------------------------------------------------------------
And it can be modified or updated to the following so that it can run:
-----------------------------------------------------------------------------------------------
// As the RDD class is not automatically imported therefore we have to import it explicitly
import org.apache.spark.rdd.RDD
class SearchFunctions(val query: String) {
def isMatch(s : String ): Boolean = {
s.contains(query)
}
def getMatchesFunctionReference(rdd: RDD[String]): RDD[Boolean] = {
// Problem: "isMatch" means "this.isMatch", so we pass all of "this"
rdd.map(isMatch)
}
def getMatchesFieldReference(rdd: RDD[String]): RDD[Array[String]] = {
// Problem: "query" means "this.query", so we pass all of "this"
rdd.map(x => x.split(query))
}
def getMatchesNoReference(rdd: RDD[String]): RDD[Array[String]] = {
// Safe: extract just the field we need into a local variable
val query_ = this.query
rdd.map(x => x.split(query_))
}
}
-----------------------------------------------------------------------------------------------
Regards,
Gourav
Note from the Author or Editor: We should include the import org.apache.spark.rdd.RDD in the standard imports.
|
Gourav Sengupta |
Apr 15, 2015 |
May 08, 2015 |
| PDF |
Page 33
Example 3-23. Java function passing with named class |
There are extra () in the class i.e.
class ContainsError implements Function<String, Boolean>() {
public Boolean call(String x) { return x.contains("error"); }
}
Should be
class ContainsError implements Function<String, Boolean> {
public Boolean call(String x) { return x.contains("error"); }
}
See https://spark.apache.org/docs/1.4.1/programming-guide.html#passing-functions-to-spark
Kind Regards
Note from the Author or Editor: Removed extra (), thanks
|
Guillermo Schiava |
Aug 12, 2015 |
|
| PDF |
Page 33
Figure 3-3 |
READ: RDD2.subtract(RDD2)
{panda,tea}
SHOULD READ: RDD1.subtract(RDD2)
{panda, tea}
Note from the Author or Editor: I've fixed this is the latest build for author provided images, but if O'Reilly has already started remaking the images you may need to redo the Figure 3-3 bottom right as the submitter has suggested.
|
Tatsuo Kawasaki |
Aug 18, 2014 |
Jan 26, 2015 |
| Printed |
Page 36
figure 3-4 |
Page 36, figure 3-4, RDD2: list should be: coffee, monkey, kitty.
Currently money is there instead of monkey.
Note from the Author or Editor: Figure 3-4 should be updated to say monkey instead of money.
|
Anonymous |
Mar 02, 2015 |
Mar 27, 2015 |
| PDF |
Page 37
Figure 3-2. Map and filter on an RDD |
FilteredRDD
{1,4,9,16}
should be
FilteredRDD
{2,3,4}
Note from the Author or Editor: Thanks for pointing this out, I've gone ahead and fixed this and it should be in our next build.
|
Tang Yong |
Aug 18, 2014 |
Jan 26, 2015 |
| PDF |
Page 37
Example 3-24. Scala squaring the values in an RDD |
println(result.collect())
should be
result.collect().foreach{x=>println(x)}
Note from the Author or Editor: Fixed in the latest build.
|
Tang Yong |
Aug 18, 2014 |
Jan 26, 2015 |
| PDF |
Page 40
Example 3-35. Python |
Python aggregate example
sumCount = nums.aggregate((0, 0),
(lambda acc, value: (acc[0] + value, acc[1] + 1)), >>add missing paren<<
(lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1])))
Last line remove extra parenthesis
Note from the Author or Editor: Fixed by author in 54759cf2cf0e41b81bdd56eaa5adb308ac911845
|
Anonymous |
Jan 25, 2015 |
Mar 27, 2015 |
| Printed |
Page 45
Example 3-40 |
In example 3-40, "result.persist(StorageLevel.DISK_ONLY)" will not work, as it is not imported in the example.
Adding "import org.apache.spark.storage.StorageLevel" will fix this.
Note from the Author or Editor: Thanks for pointing this out, we mention the package that the StorageLevels come from in the persistence table but I've added an import in the example code for clarity.
|
Tom Hubregtsen |
Apr 19, 2015 |
May 08, 2015 |
| PDF |
Page 50
Table 4-2 |
Right outer join and left outer join "Purpose" descriptions are reversed; in the right outer join, the key must be present in the "other" RDD, not "this" RDD. Reverse mistake is made in the left outer join purpose description.
It's clear from looking at the "Result" columns, which are correct, that in the right-join case the only key in the result is from "other", while in left-join the keys in the results are from "this".
From scaladoc for right outer join:
For each element (k, w) in other, the resulting RDD will either contain all pairs (k, (Some(v), w)) for v in this, or the pair (k, (None, w)) if no elements in this have key k.
Note from the Author or Editor: Great catch, I've swapped the two.
|
Wayne M Adams |
Feb 24, 2015 |
Mar 27, 2015 |
| Printed |
Page 53
Example 4-11. Second line. |
Shouldn't "rdd.flatMap(...)" be "input.flatMap(...)"
Note from the Author or Editor: Fixed in atlass
|
Jim Williams |
Apr 06, 2015 |
May 08, 2015 |
| PDF |
Page 54
United States |
Example 4-12 does not print out its results as the others do. Also, 4-13 should arguably use a foreach to print as it uses side effects.
Note from the Author or Editor: Fixed print and swapped to foreach in 6f5d7e5d065f88e4df46e03a61fb5b70d8982649
|
Justin Pihony |
Jan 25, 2015 |
Mar 27, 2015 |
| PDF |
Page 57
Example 4-16 |
Apparent cut-and-paste mistake: the "Custom parallelism" example is the same as the default one, in that no parallelism Int was specified in the example call.
Note from the Author or Editor: Fixed, thanks :)
|
Wayne M Adams |
Feb 24, 2015 |
Mar 27, 2015 |
| ePub |
Page 58
Example 4-12 |
Example 4-12 (Python) is not equivalent to the others: the sum of numbers must be divided by the count to yield the average. Having the Python example implement the same behavior as the Scala and Java examples will aid the reader. My version of the example is:
nums = sc.parallelize([(1,2),(1,4),(3,6),(4,6),(4,8),(4,13)])
sumCount = nums.combineByKey((lambda x : (x , 1)),
(lambda x, y : (x[0] + y, x[1] + 1)),
(lambda x ,y : (x [0] + y[0], x[1] + y[1])))
print sumCount.map(lambda (k,v): (k, v[0]/float(v[1]))).collect()
Note from the Author or Editor: no action, fixed in book already.
|
Andres Moreno |
Dec 02, 2014 |
Jan 26, 2015 |
| PDF |
Page 60
Table 4-3 |
collectAsMap() doesn't return multi Map. so Result should be
Map{(1,2), (3, 6)}
https://github.com/apache/spark/blob/b0d884f044fea1c954da77073f3556cd9ab1e922/core/src/main/scala/org/apache/spark/rdd/PairRDDFunctions.scala#L659
/**
* Return the key-value pairs in this RDD to the master as a Map.
*
* Warning: this doesn't return a multimap (so if you have multiple values to the same key, only
* one value per key is preserved in the map returned)
Note from the Author or Editor: Thanks for catching that, I've updated the example.
|
Tatsuo Kawasaki |
May 08, 2015 |
|
| PDF |
Page 64
4th paragraph |
Page 64, Section "Determining an RDD’s Partitioner", second line says, "or partitioner() method in Java".
There is no method "partitioner()" available on "org.apache.spark.api.java.JavaPairRDD." (spark version 1.3.1)
Is this a typo for the method "partitions()"?
Note from the Author or Editor: Seems that the partitioner() function doesn't exist. I'll drop it. (partitions() doesn't quite return the partitioner rather a list of the partitions).
|
Anonymous |
May 09, 2015 |
|
| Printed |
Page 65
Example 4-24 |
In example 4-24, "val partitioned = pairs.partitionBy(new spark.HashPartitioner(2))" will not work, as it is not imported in the example. Either an import or a change into "new org.apache.spark.HashPartitioner(2)" would work.
Note from the Author or Editor: Thanks for pointing this out, I'll update our example to include the import. Fixed in cd090206381a9bbf0466468bf7128a808085522f.
|
Tom Hubregtsen |
Mar 10, 2015 |
Mar 27, 2015 |
| PDF |
Page 66
JSON |
It is mentioned that liftweb-json is used for JSON-parsing, however Play JSON is used for parsing and then liftweb-json for JSON output. This is a bit confusing.
Note from the Author or Editor: I've fixed this in the latest push.
|
Anonymous |
Aug 05, 2014 |
Jan 26, 2015 |
| PDF |
Page 67
United States |
The case under //Run 10 iterations shadows the links variable. This might be confusing for new developers
Note from the Author or Editor: Thanks, thats a good point since that behaviour is maybe confusing for people coming from other languages. I've clarified it by using a different local variable in the dev verison.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 70
United States |
feildnames
Note from the Author or Editor: Fixed in the latest build (typo)
|
Anonymous |
Aug 17, 2014 |
Jan 26, 2015 |
| PDF |
Page 70
first paragraph |
"In Python if an value isn’t present None is used and if the value is present the regular value"
should be
"In Python if a value isn’t present None is used and if the value is present the regular value"
Note from the Author or Editor: Fixed in atlass
|
Mark Needham |
Nov 30, 2014 |
Jan 26, 2015 |
| PDF |
Page 72
United States |
"The input formats that Spark wraps all
transparently handle compressed formats based on the file extension."
is an awkwardly worded sentence.
Note from the Author or Editor: Improved a bit :)
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 73
Example 5-4 |
(p. 91 of the PDF doc; p. 73 of the book). This is a total nitpick, but the file url is
file://home/holden/salesFiles
and instead should be
file:///home/holden/salesFiles
Note from the Author or Editor: Thanks, fixed :)
|
Wayne M Adams |
Feb 26, 2015 |
Mar 27, 2015 |
| PDF |
Page 73
United States |
"Sometimes it’s important to know which file which piece of input came from"
should probably be
"Sometimes it’s important to know which file each piece of input came from"
Note from the Author or Editor: Thanks, fixed in the dev version.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| Printed, PDF |
Page 76
Example 5-10 |
Reads:
result.filter(p => P.lovesPandas).map(mapper.writeValueAsString(_)) .saveAsTextFile(outputFile)
Should read:
result.filter(p => p.lovesPandas).map(mapper.writeValueAsString(_)) .saveAsTextFile(outputFile)
Note from the Author or Editor: Thanks for catching this. I've fixed the case issue in this example.
|
Myles Baker |
May 11, 2015 |
|
| PDF |
Page 78
United States |
import Java.io.StringReader should use a lowercase j
This happens in a number of locations actually.
Note from the Author or Editor: Thanks for catching this. I've applied a global fix to the dev copy.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 79
United States |
"If there are only a few input files, and you need to use the wholeFile() method,"
should be
"If there are only a few input files, and you need to use the wholeTextFile() method,"
Note from the Author or Editor: Thanks, fixed to wholeTextFiles.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| Printed |
Page 82
example 5-20 |
Example 5-20. Loading a SequenceFile in Python should drop the "val" on "val data = ..." Works otherwise.
Note from the Author or Editor: Thanks for catching this, I went ahead and fixed this in atlass.
|
jonathan greenleaf |
Apr 09, 2015 |
May 08, 2015 |
| PDF |
Page 84
United States |
"A similar function, hadoopFile(), exists for working with Hadoop input formats implemented with the older API."
This sentence is in respect to newAPIHadoopFile and should be moved up by one sentence. Maybe as a side-note as it would then throw off the flow into talking about the 3 classes.
Note from the Author or Editor: re-arranged that paragraph for clarity.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 85
Example 5-13/5-14 |
Minor issue; there should be a
import Java.io.StringReader
statement in your CSV loading examples in Scala (and presumably Java)
Note from the Author or Editor: I fixed in holden@hmbp2:~/repos/1230000000573$ git log
commit a9f9f34a3b8513885325f47c1101e657cb5faa89
|
Timothy Elser |
Oct 07, 2014 |
Jan 26, 2015 |
| ePub |
Page 87
|
"We have looked at the fold, combine, and reduce actions on basic RDDs". There is no RDD.combine(), did you mean aggregate()?
Note from the Author or Editor: Replace combine with aggregate (fixed in f7df06b0c1d730a3a20f173dea8d4ce5c137aa0d).
|
Thomas Oldervoll |
Jan 25, 2015 |
Mar 27, 2015 |
| PDF |
Page 90
United States |
"you can specify SPARK_HADOOP_VERSION= as a environment variable" should be as AN environment variable.
Note from the Author or Editor: Fixed :)
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 91
Example 5-31 |
(p. 109 PDF document; page 91 of book). Minor -- with the import of the HiveContext class, there's no need to fully qualify the class name when invoking the HiveContext constructor.
Note from the Author or Editor: Thanks for catching this, I've simplified the code as suggested in b9d7e376aae27e2f8d4de6d431691a62852d92ba.
|
Wayne M Adams |
Feb 26, 2015 |
Mar 27, 2015 |
| PDF |
Page 95
United States |
Why is the SparkContext and JavaSparkContext in example 5-40 and 5-41 using different arguments? If no reason, then they should be synchronized.
Note from the Author or Editor: Unified :)
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 101
United States |
Example 6-3 creates the SparkContext, while the other examples do not.
Note from the Author or Editor: Unified, thanks.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 102
Third paragraph |
Don't need a comma before the word "or" in:
"... when there are multiple values to keep track of, or when the same value needs..."
"... percentage of our data to be corrupted, or allow for the backend to fail..."
Note from the Author or Editor: Fixed.
|
Anonymous |
Feb 04, 2015 |
Mar 27, 2015 |
| PDF |
Page 103
United States |
Example 6-5 outputs Too many errors: # in #
But, this would be "invalid in valid", where what is really needed is "invalid in total" or another wording.
Note from the Author or Editor: True, changed the output in the example to clarify.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 111
United States |
String interpolation in example 6-17 needs to be in brackets as it uses a property of the y object.
Note from the Author or Editor: Good catch, fixed in the dev build.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| ePub |
Page 112
3rd |
Text reads: “Spark has many levels of persistence to chose from based on what our goals are. ”
should read: “Spark has many levels of persistence to choose from based on what our goals are. ”
Note from the Author or Editor: fixed in latest version of atlass
|
Bruce Sanderson |
Nov 15, 2014 |
Jan 26, 2015 |
| PDF |
Page 114
United States |
std.stdev in example 6-19 should be stats.stdev
Note from the Author or Editor: Fixed in dev :)
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| Printed, PDF |
Page 123
Example 7-4 |
Incorrect variable name:
# Submitting a Python application in YARN client mode
$ export HADOP_CONF_DIR=/opt/hadoop/conf
Should be HADOOP_CONF_DIR
Note from the Author or Editor: I've swithced HADOP to HADOOP in the example as pointed out.
|
Myles Baker |
May 13, 2015 |
|
| ePub |
Page 126
1st paragraph |
The text "...to how we used fold and map compute the entire RDD average”
should read:
“ ...to how we used fold and map to compute the entire RDD average”
Note from the Author or Editor: Fixed in atlass
|
Bruce Sanderson |
Nov 18, 2014 |
Jan 26, 2015 |
| PDF |
Page 127
United States |
The comment in example 7-7 "A special option to exclude Scala itself form our assembly JAR, since Spark" should be "A special option to exclude Scala itself FROM our assembly JAR, since Spark"
Note from the Author or Editor: Fixed :)
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF, ePub |
Page 130
5th step |
It says "(...) run bin/stop-all.sh (...)"
It should be "(...) run sbin/stop-all.sh (...)"
Note from the Author or Editor: Thanks for catching that, I've updated it in adbdb12def7218b0f54cb67f96cb688775e05ec5
|
Alejandro Ramon Lopez del Huerto |
Mar 10, 2015 |
Mar 27, 2015 |
| PDF |
Page 134
United States |
"to elect a master when running in multimaster node" should be "to elect a master when running in multimaster MODE"
Note from the Author or Editor: fixed in dev.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 141
Example 8-1 |
Example 8-1. Creating an application using a SparkConf in Python
1) You should remove the 'new' in conf = new SparkConf()
2) You should change the argument in SparkContext()
https://spark.apache.org/docs/latest/programming-guide.html#initializing-spark
https://issues.apache.org/jira/browse/SPARK-2003
Correct code would be:
conf = SparkConf()
conf.setAppName("My Spark App")
conf.set("spark.master", "local[4]")
conf.set("spark.ui.port", "36000")
sc = SparkContext(conf=conf)
OR
conf = SparkConf() \
.setAppName("My Spark App") \
.set("spark.master", "local[4]") \
.set("spark.ui.port", "36000")
sc = SparkContext(conf=conf)
Note from the Author or Editor: Thanks for catching this, I've fixed it in our dev version.
|
Tatsuo Kawasaki |
Jun 16, 2015 |
|
| PDF |
Page 142
Example 8-3 |
READ:
JavaSparkContext sc = JavaSparkContext(conf);
SHOULD READ:
JavaSparkContext sc = new JavaSparkContext(conf);
Note from the Author or Editor: Thanks, I've fixed this in atlas.
|
Tatsuo Kawasaki |
Jun 16, 2015 |
|
| PDF |
Page 145
United States |
spark.[X}.port explanation is missing the ui value (spark.ui.port)
Note from the Author or Editor: Yup we can configure the UI this way too, updated the table.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 146
Example 8-7 |
The code example:
scala> val tokenized = input.
| map(line => line.split(" ")).
| filter(words => words.size > 0)
on my machine (Spark 1.2.1, Scala 2.10.4, Ubuntu 14.04)
gives the following:
scala> tokenized.collect()
res1: Array[Array[String]] = Array(Array(INFO, This, is, a, message, with, content), Array(INFO, This, is, some, other, content), Array(""), Array(INFO, Here, are, more, messages), Array(WARN, This, is, a, warning), Array(""), Array(ERROR, Something, bad, happened), Array(WARN, More, details, on, the, bad, thing), Array(INFO, back, to, normal, messages))
Note there are two one-element arrays with a single empty string in each -- these are for the two empty lines. Apparently the filter on "words.size > 0" does not give the expected result, since an empty line, split on " ", give an array of length 1 with one empty element, rather than an array of length 0. So it doesn't filter.
The result of collect()ing on counts is:
scala> counts.collect()
res0: Array[(String, Int)] = Array((ERROR,1), (INFO,4), ("",2), (WARN,2))
in my file, each empty line is just a newline character.
Note from the Author or Editor: This is a good catch, since split on an empty string returns an array with a single element the result isn't what we want. Swapping the order of the map/filter does what we want. Fixed in 0374336d16ebb32ca3452b37c7bb1642ca0755a3.
|
Wayne M Adams |
Mar 10, 2015 |
Mar 27, 2015 |
| PDF |
Page 147
United States |
"To trigger computation, let’s call an action on the counts RDD and collect() it to the driver, as shown in Example 8-9" might read better as "To trigger computation, let’s call an action on the counts RDD BY collect()ING it to the driver, as shown in Example 8-9."
Note from the Author or Editor: Does sound better, thanks updated in dev.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 156
United States |
Example 8-11 coalesces to 5, but the number of partitions is listed as 4.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| Printed |
Page 157
6th line down of text |
Extra "this".
Note from the Author or Editor: Thanks for catching this, fixed in atlass.
|
Jim Williams |
Apr 07, 2015 |
May 08, 2015 |
| PDF |
Page 157
1st paragraph |
READ:
-Dsun.io.serialization.extended DebugInfo=true
SHOULD READ:
-Dsun.io.serialization.extendedDebugInfo=true
Note from the Author or Editor: Thanks, I've fixed this in atlas :)
|
Tatsuo Kawasaki |
Jul 20, 2015 |
|
| PDF |
Page 162
2nd Paragraph of section called "Linking with Spark SQL" |
Text page 162, PDF page 180, of the 1 April edition contains the following fragment, with duplicated reference to Hive query language:
"...and the Hive query language (HiveQL). Hive query language (HQL) It is important..."
Note from the Author or Editor: Thanks for catching this, I think this was from an indexing tag that accidentally got included in the text. I've changed this in atlass and it should be removed in the next update.
|
Wayne M Adams |
Apr 02, 2015 |
May 08, 2015 |
| PDF |
Page 162
United States |
Hive query language is parenthesized twice, once as (HiveQL) and another as (HQL). This should probably be made common.
In fact, searching the entire book, there are a handful of HQL references, but it is mostly used as HiveQL. Again, this might need changed if you want more consistency?
Note from the Author or Editor: Thanks, I've made this consistent in our atlas version.
|
Justin Pihony |
Apr 27, 2015 |
|
| PDF |
Page 163
Table |
Table 9.1 lists the Scala and Java types/imports for Timestamp.
java.sql.TimeStamp
should be
java.sql.Timestamp
Note from the Author or Editor: Fixed.
|
Anirudh Koul |
Feb 03, 2015 |
Mar 27, 2015 |
| PDF |
Page 165
United States |
Example 9-8 does not match 9-6 and 9-7 in that it does not show the creation of the SparkContext.
Note from the Author or Editor: Unified.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 179
United States |
Example 9-39 has a collect and println, whereas 9-36 and 9-37 do not.
Note from the Author or Editor: Removed the println from the java example (done in atlas).
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 181
Table 9-2 |
Default 'spark.sql.parquet.compression.codec' property is gzip.
https://spark.apache.org/docs/latest/sql-programming-guide.html#configuration
https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/SQLConf.scala#L251
val PARQUET_COMPRESSION = enumConf("spark.sql.parquet.compression.codec",
valueConverter = v => v.toLowerCase,
validValues = Set("uncompressed", "snappy", "gzip", "lzo"),
defaultValue = Some("gzip"),
Note from the Author or Editor: This is correct (although in the current version of Spark it's now snappy). I've updated the table to mention this.
|
Tatsuo Kawasaki |
Jun 27, 2015 |
|
| PDF |
Page 185
United States |
Example 10-5 @override is missing on the call method.
Note from the Author or Editor: Added missing @override
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 195
United States |
In Figure 10-7, An arrow is missing on the inverse graph from {4,2} to 20
Note from the Author or Editor: On the right side of the graph we need to add an arrow from the {4,2} box to 20 and remove its line to box 22.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| PDF |
Page 196
Third line from top |
The example given is:
reduceByKeyAndWindow(
new AddLongs(),
// Adding elements in the new batches entering the window
new SubtractLongs()
// Removing elements from the oldest batches exiting the window
Durations.seconds(30), // Window duration
Durations.seconds(10)); // Slide duration
Well there should be comma after new SubtractLongs() i.e. it should be new SubtractLongs(),
The below error is already reported by 'Jongyoung Park ' but the page number mentioned is wrong. it should be 196 and not 198:
In Example 10-22 Durations is misspelled as Dirations.
Note from the Author or Editor: Thanks for point this out, I've added the missing comma.
|
Anonymous |
Jun 02, 2015 |
|
| PDF |
Page 198
Example 10-22 |
In last two lines, "Durations" is misprinted as "Dirations".
Note from the Author or Editor: This is correct, I've fixed this in atlas.
|
Jongyoung Park |
May 31, 2015 |
|
| PDF |
Page 199
United States |
"...it needs to have a consistent date format..."
I am pretty sure this should be datA format
Note from the Author or Editor: fixed.
|
Justin Pihony |
Apr 28, 2015 |
May 08, 2015 |
| PDF |
Page 201
United States |
Example 10-32 uses a helper with a map for the final action, whereas 10-33 simply calls print
Note from the Author or Editor: There was a difference, I've made both just print.
|
Justin Pihony |
Apr 27, 2015 |
May 08, 2015 |
| Mobi |
Page 10409
Example 10-34 |
There are couple of naming errors in Scala version of example for newer (as of Spark 1.3) Spark Streaming and Apache Kafka createDirectStream() method (Example 10-34: Apache Kafka directly reading Panda's topic in Scala):
- brokers val should be renamed to kafkaParams (brokers is referenced inside Map.apply() method);
- topics val should be renamed to topicsSet (topicSet is referenced inside createDirectStream() method);
Note from the Author or Editor: Thanks for catching this, I've fixed it it in the latest dev version.
|
Ivanov Vladimir |
Apr 22, 2015 |
May 08, 2015 |