Unable to find the cause of String Index Out of Bound Exception in my MapReduce code
I am trying out a MapReduce code written in Java. I need to get the number of employees who were promoted in each department but still left the organization. I am trying to pass concatenated value of department and promotion as the key and resignation as the value.
Sample Data
left promotion_last_5years deptartment
1, 0, sales
1, 1, sales
1, 1, hr
1, 0, sales
Mapper Code:
public void map(LongWritable key, Text text, Context context) throws IOException, InterruptedException
{
String row = text.toString();
String values = row.trim().split(",");
int left = 0;
int promotion = 0;
String dept = "";
String DeptPromoted = "";
try
{
if(values.length == 10 && !header.equals(row))
{
left = Integer.parseInt(values[6]);
promotion = Integer.parseInt(values[7]);
dept = values[8];
DeptPromoted = dept+"-"+values[7]; // sales-0
}
}
catch (Exception e)
{
e.printStackTrace();
}
context.write(new Text(DeptPromoted), new IntWritable(left)); //sales-0 1
}
Below is my reducer code where I am using substring to seperate values of department and promotion and then use these values to calculate the number of employees promoted but resigned.
Reducer Code:
public void reduce(Text key, Iterable<IntWritable> values, Context context throws IOException, InterruptedException
{
//sales-0 1
int count = 0;
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
if (L == '1')
{
for (IntWritable val: values)
{
if(val.get() == 1)
{
count++;
}
}
}
context.write(key, new IntWritable(count));
}
I believe the StringIndexOutofBoundException is from the reducer where I am trying to get the character value at the end of the string. Can someone help to resolve the error below?
Error: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:18)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:1)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
java mapreduce
add a comment |
I am trying out a MapReduce code written in Java. I need to get the number of employees who were promoted in each department but still left the organization. I am trying to pass concatenated value of department and promotion as the key and resignation as the value.
Sample Data
left promotion_last_5years deptartment
1, 0, sales
1, 1, sales
1, 1, hr
1, 0, sales
Mapper Code:
public void map(LongWritable key, Text text, Context context) throws IOException, InterruptedException
{
String row = text.toString();
String values = row.trim().split(",");
int left = 0;
int promotion = 0;
String dept = "";
String DeptPromoted = "";
try
{
if(values.length == 10 && !header.equals(row))
{
left = Integer.parseInt(values[6]);
promotion = Integer.parseInt(values[7]);
dept = values[8];
DeptPromoted = dept+"-"+values[7]; // sales-0
}
}
catch (Exception e)
{
e.printStackTrace();
}
context.write(new Text(DeptPromoted), new IntWritable(left)); //sales-0 1
}
Below is my reducer code where I am using substring to seperate values of department and promotion and then use these values to calculate the number of employees promoted but resigned.
Reducer Code:
public void reduce(Text key, Iterable<IntWritable> values, Context context throws IOException, InterruptedException
{
//sales-0 1
int count = 0;
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
if (L == '1')
{
for (IntWritable val: values)
{
if(val.get() == 1)
{
count++;
}
}
}
context.write(key, new IntWritable(count));
}
I believe the StringIndexOutofBoundException is from the reducer where I am trying to get the character value at the end of the string. Can someone help to resolve the error below?
Error: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:18)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:1)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
java mapreduce
Can you please provide the error log?
– M S Hossain
Nov 28 '18 at 4:14
I have added the error now.
– Rich
Nov 29 '18 at 2:21
add a comment |
I am trying out a MapReduce code written in Java. I need to get the number of employees who were promoted in each department but still left the organization. I am trying to pass concatenated value of department and promotion as the key and resignation as the value.
Sample Data
left promotion_last_5years deptartment
1, 0, sales
1, 1, sales
1, 1, hr
1, 0, sales
Mapper Code:
public void map(LongWritable key, Text text, Context context) throws IOException, InterruptedException
{
String row = text.toString();
String values = row.trim().split(",");
int left = 0;
int promotion = 0;
String dept = "";
String DeptPromoted = "";
try
{
if(values.length == 10 && !header.equals(row))
{
left = Integer.parseInt(values[6]);
promotion = Integer.parseInt(values[7]);
dept = values[8];
DeptPromoted = dept+"-"+values[7]; // sales-0
}
}
catch (Exception e)
{
e.printStackTrace();
}
context.write(new Text(DeptPromoted), new IntWritable(left)); //sales-0 1
}
Below is my reducer code where I am using substring to seperate values of department and promotion and then use these values to calculate the number of employees promoted but resigned.
Reducer Code:
public void reduce(Text key, Iterable<IntWritable> values, Context context throws IOException, InterruptedException
{
//sales-0 1
int count = 0;
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
if (L == '1')
{
for (IntWritable val: values)
{
if(val.get() == 1)
{
count++;
}
}
}
context.write(key, new IntWritable(count));
}
I believe the StringIndexOutofBoundException is from the reducer where I am trying to get the character value at the end of the string. Can someone help to resolve the error below?
Error: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:18)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:1)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
java mapreduce
I am trying out a MapReduce code written in Java. I need to get the number of employees who were promoted in each department but still left the organization. I am trying to pass concatenated value of department and promotion as the key and resignation as the value.
Sample Data
left promotion_last_5years deptartment
1, 0, sales
1, 1, sales
1, 1, hr
1, 0, sales
Mapper Code:
public void map(LongWritable key, Text text, Context context) throws IOException, InterruptedException
{
String row = text.toString();
String values = row.trim().split(",");
int left = 0;
int promotion = 0;
String dept = "";
String DeptPromoted = "";
try
{
if(values.length == 10 && !header.equals(row))
{
left = Integer.parseInt(values[6]);
promotion = Integer.parseInt(values[7]);
dept = values[8];
DeptPromoted = dept+"-"+values[7]; // sales-0
}
}
catch (Exception e)
{
e.printStackTrace();
}
context.write(new Text(DeptPromoted), new IntWritable(left)); //sales-0 1
}
Below is my reducer code where I am using substring to seperate values of department and promotion and then use these values to calculate the number of employees promoted but resigned.
Reducer Code:
public void reduce(Text key, Iterable<IntWritable> values, Context context throws IOException, InterruptedException
{
//sales-0 1
int count = 0;
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
if (L == '1')
{
for (IntWritable val: values)
{
if(val.get() == 1)
{
count++;
}
}
}
context.write(key, new IntWritable(count));
}
I believe the StringIndexOutofBoundException is from the reducer where I am trying to get the character value at the end of the string. Can someone help to resolve the error below?
Error: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:18)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:1)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
java mapreduce
java mapreduce
edited Nov 29 '18 at 2:21
Rich
asked Nov 28 '18 at 3:51
RichRich
104
104
Can you please provide the error log?
– M S Hossain
Nov 28 '18 at 4:14
I have added the error now.
– Rich
Nov 29 '18 at 2:21
add a comment |
Can you please provide the error log?
– M S Hossain
Nov 28 '18 at 4:14
I have added the error now.
– Rich
Nov 29 '18 at 2:21
Can you please provide the error log?
– M S Hossain
Nov 28 '18 at 4:14
Can you please provide the error log?
– M S Hossain
Nov 28 '18 at 4:14
I have added the error now.
– Rich
Nov 29 '18 at 2:21
I have added the error now.
– Rich
Nov 29 '18 at 2:21
add a comment |
2 Answers
2
active
oldest
votes
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
If key is an empty text then len = 0 so str.charAt(0-1) is str.charAt(-1) it causes StringIndexOutOfBoundsException. So please check if the Text key is empty or not.
Thanks a lot! After just adding an if condition to check if the key is not empty, it worked!
– Rich
Dec 1 '18 at 0:25
add a comment |
The IndexOutOfBoundException is probably because of the code:-
char L = str.charAt(len - 1);
Here is the reason:-
Your data includes:- 1 0 sales
and your code is splitting the data on the basis of "," (comma):-
String row = text.toString();
String values = row.trim().split(",");
Considering you are using normal TextInputFormat. your values will always have only one record.
In that scenario, the key to reducer will always be blank i.e. ""
so calling
int len = str.length(); //7
char L = str.charAt(len - 1);
should throw a StringIndexOutOfBoundsException.
a sample code:-
String s = ""
int length = s.length()
Character c = s.charAt(length - 1)
My suggestion is to make appropriate changes in your code and add necessary checks.
I missed to add comma to the sample data here. My data is in a CSV file. Will it still have the issue that you had pointed out? I am not clear why the key would be blank.
– Rich
Nov 29 '18 at 2:23
It depends on the data, you can do a dry run with data to understand the issue. In the code, you are only populating the key If you have 10 elements in the array. That means you should have at least 9 commas in your data. If you are uncertain of this then you should do a check before doing string.charAt()
– Garvit
Nov 29 '18 at 6:14
Thanks for your help! My code works now.
– Rich
Dec 1 '18 at 0:26
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53511850%2funable-to-find-the-cause-of-string-index-out-of-bound-exception-in-my-mapreduce%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
If key is an empty text then len = 0 so str.charAt(0-1) is str.charAt(-1) it causes StringIndexOutOfBoundsException. So please check if the Text key is empty or not.
Thanks a lot! After just adding an if condition to check if the key is not empty, it worked!
– Rich
Dec 1 '18 at 0:25
add a comment |
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
If key is an empty text then len = 0 so str.charAt(0-1) is str.charAt(-1) it causes StringIndexOutOfBoundsException. So please check if the Text key is empty or not.
Thanks a lot! After just adding an if condition to check if the key is not empty, it worked!
– Rich
Dec 1 '18 at 0:25
add a comment |
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
If key is an empty text then len = 0 so str.charAt(0-1) is str.charAt(-1) it causes StringIndexOutOfBoundsException. So please check if the Text key is empty or not.
String str = "";
str = key.toString(); //sales-0
int len = str.length(); //7
char L = str.charAt(len - 1);
If key is an empty text then len = 0 so str.charAt(0-1) is str.charAt(-1) it causes StringIndexOutOfBoundsException. So please check if the Text key is empty or not.
answered Nov 30 '18 at 4:18
M S HossainM S Hossain
483310
483310
Thanks a lot! After just adding an if condition to check if the key is not empty, it worked!
– Rich
Dec 1 '18 at 0:25
add a comment |
Thanks a lot! After just adding an if condition to check if the key is not empty, it worked!
– Rich
Dec 1 '18 at 0:25
Thanks a lot! After just adding an if condition to check if the key is not empty, it worked!
– Rich
Dec 1 '18 at 0:25
Thanks a lot! After just adding an if condition to check if the key is not empty, it worked!
– Rich
Dec 1 '18 at 0:25
add a comment |
The IndexOutOfBoundException is probably because of the code:-
char L = str.charAt(len - 1);
Here is the reason:-
Your data includes:- 1 0 sales
and your code is splitting the data on the basis of "," (comma):-
String row = text.toString();
String values = row.trim().split(",");
Considering you are using normal TextInputFormat. your values will always have only one record.
In that scenario, the key to reducer will always be blank i.e. ""
so calling
int len = str.length(); //7
char L = str.charAt(len - 1);
should throw a StringIndexOutOfBoundsException.
a sample code:-
String s = ""
int length = s.length()
Character c = s.charAt(length - 1)
My suggestion is to make appropriate changes in your code and add necessary checks.
I missed to add comma to the sample data here. My data is in a CSV file. Will it still have the issue that you had pointed out? I am not clear why the key would be blank.
– Rich
Nov 29 '18 at 2:23
It depends on the data, you can do a dry run with data to understand the issue. In the code, you are only populating the key If you have 10 elements in the array. That means you should have at least 9 commas in your data. If you are uncertain of this then you should do a check before doing string.charAt()
– Garvit
Nov 29 '18 at 6:14
Thanks for your help! My code works now.
– Rich
Dec 1 '18 at 0:26
add a comment |
The IndexOutOfBoundException is probably because of the code:-
char L = str.charAt(len - 1);
Here is the reason:-
Your data includes:- 1 0 sales
and your code is splitting the data on the basis of "," (comma):-
String row = text.toString();
String values = row.trim().split(",");
Considering you are using normal TextInputFormat. your values will always have only one record.
In that scenario, the key to reducer will always be blank i.e. ""
so calling
int len = str.length(); //7
char L = str.charAt(len - 1);
should throw a StringIndexOutOfBoundsException.
a sample code:-
String s = ""
int length = s.length()
Character c = s.charAt(length - 1)
My suggestion is to make appropriate changes in your code and add necessary checks.
I missed to add comma to the sample data here. My data is in a CSV file. Will it still have the issue that you had pointed out? I am not clear why the key would be blank.
– Rich
Nov 29 '18 at 2:23
It depends on the data, you can do a dry run with data to understand the issue. In the code, you are only populating the key If you have 10 elements in the array. That means you should have at least 9 commas in your data. If you are uncertain of this then you should do a check before doing string.charAt()
– Garvit
Nov 29 '18 at 6:14
Thanks for your help! My code works now.
– Rich
Dec 1 '18 at 0:26
add a comment |
The IndexOutOfBoundException is probably because of the code:-
char L = str.charAt(len - 1);
Here is the reason:-
Your data includes:- 1 0 sales
and your code is splitting the data on the basis of "," (comma):-
String row = text.toString();
String values = row.trim().split(",");
Considering you are using normal TextInputFormat. your values will always have only one record.
In that scenario, the key to reducer will always be blank i.e. ""
so calling
int len = str.length(); //7
char L = str.charAt(len - 1);
should throw a StringIndexOutOfBoundsException.
a sample code:-
String s = ""
int length = s.length()
Character c = s.charAt(length - 1)
My suggestion is to make appropriate changes in your code and add necessary checks.
The IndexOutOfBoundException is probably because of the code:-
char L = str.charAt(len - 1);
Here is the reason:-
Your data includes:- 1 0 sales
and your code is splitting the data on the basis of "," (comma):-
String row = text.toString();
String values = row.trim().split(",");
Considering you are using normal TextInputFormat. your values will always have only one record.
In that scenario, the key to reducer will always be blank i.e. ""
so calling
int len = str.length(); //7
char L = str.charAt(len - 1);
should throw a StringIndexOutOfBoundsException.
a sample code:-
String s = ""
int length = s.length()
Character c = s.charAt(length - 1)
My suggestion is to make appropriate changes in your code and add necessary checks.
edited Nov 28 '18 at 5:46
answered Nov 28 '18 at 4:35
GarvitGarvit
154
154
I missed to add comma to the sample data here. My data is in a CSV file. Will it still have the issue that you had pointed out? I am not clear why the key would be blank.
– Rich
Nov 29 '18 at 2:23
It depends on the data, you can do a dry run with data to understand the issue. In the code, you are only populating the key If you have 10 elements in the array. That means you should have at least 9 commas in your data. If you are uncertain of this then you should do a check before doing string.charAt()
– Garvit
Nov 29 '18 at 6:14
Thanks for your help! My code works now.
– Rich
Dec 1 '18 at 0:26
add a comment |
I missed to add comma to the sample data here. My data is in a CSV file. Will it still have the issue that you had pointed out? I am not clear why the key would be blank.
– Rich
Nov 29 '18 at 2:23
It depends on the data, you can do a dry run with data to understand the issue. In the code, you are only populating the key If you have 10 elements in the array. That means you should have at least 9 commas in your data. If you are uncertain of this then you should do a check before doing string.charAt()
– Garvit
Nov 29 '18 at 6:14
Thanks for your help! My code works now.
– Rich
Dec 1 '18 at 0:26
I missed to add comma to the sample data here. My data is in a CSV file. Will it still have the issue that you had pointed out? I am not clear why the key would be blank.
– Rich
Nov 29 '18 at 2:23
I missed to add comma to the sample data here. My data is in a CSV file. Will it still have the issue that you had pointed out? I am not clear why the key would be blank.
– Rich
Nov 29 '18 at 2:23
It depends on the data, you can do a dry run with data to understand the issue. In the code, you are only populating the key If you have 10 elements in the array. That means you should have at least 9 commas in your data. If you are uncertain of this then you should do a check before doing string.charAt()
– Garvit
Nov 29 '18 at 6:14
It depends on the data, you can do a dry run with data to understand the issue. In the code, you are only populating the key If you have 10 elements in the array. That means you should have at least 9 commas in your data. If you are uncertain of this then you should do a check before doing string.charAt()
– Garvit
Nov 29 '18 at 6:14
Thanks for your help! My code works now.
– Rich
Dec 1 '18 at 0:26
Thanks for your help! My code works now.
– Rich
Dec 1 '18 at 0:26
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53511850%2funable-to-find-the-cause-of-string-index-out-of-bound-exception-in-my-mapreduce%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Can you please provide the error log?
– M S Hossain
Nov 28 '18 at 4:14
I have added the error now.
– Rich
Nov 29 '18 at 2:21