-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileDataSource.java
More file actions
88 lines (77 loc) · 2.79 KB
/
Copy pathFileDataSource.java
File metadata and controls
88 lines (77 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package mapreduce.datasource;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static mapreduce.util.Constants.THREAD_COUNT;
public class FileDataSource extends DataSource<Long, String> {
private final String filePath;
public FileDataSource(String filePath) throws IOException {
Objects.requireNonNull(filePath);
requireReadableRegularFile(filePath);
this.filePath = filePath;
}
private void requireReadableRegularFile(String fileName) throws IOException {
Path path = Paths.get(fileName);
boolean regularReadableFile = Files.isRegularFile(path) && Files.isReadable(path);
if (!regularReadableFile) throw new IOException("The file is not readable or not a regular file: " + fileName);
}
@Override
public Map<Long, String> read() {
var splits = new HashMap<Long, String>();
StringBuilder fileContent = new StringBuilder();
try (Reader reader = new FileReader(this.filePath)) {
int ch;
while ((ch = reader.read()) != -1) fileContent.append((char) ch);
} catch (IOException e) {
e.printStackTrace();
// TODO: Handle the exception properly.
}
//Prepare the document for mapper tasks by splitting
//it into as many tasks as are there.
int splitSize = fileContent.length() / THREAD_COUNT;
Set<Character> delimiters = getDelimiters();
for (int i = 0; i < THREAD_COUNT; i++) {
int start = i * splitSize;
int end = start + splitSize;
while (end < fileContent.length() && !delimiters.contains(fileContent.charAt(end))) end++;
splits.put(Long.valueOf(i), fileContent.substring(start, end));
}
return splits;
}
private Set<Character> getDelimiters() {
Set<Character> delimiters = new HashSet<>();
delimiters.add(' ');
delimiters.add('\t');
delimiters.add('\n');
delimiters.add('\r');
delimiters.add('\f');
delimiters.add(',');
delimiters.add('.');
delimiters.add('!');
delimiters.add('?');
delimiters.add(';');
delimiters.add(':');
delimiters.add('[');
delimiters.add(']');
delimiters.add('(');
delimiters.add(')');
delimiters.add('_');
delimiters.add('=');
delimiters.add('+');
delimiters.add('-');
delimiters.add('<');
delimiters.add('>');
delimiters.add('\'');
delimiters.add('”');
delimiters.add('"');
return delimiters;
}
}