我正在研究一个框架,该框架可以接受输入,因为一组文件将传入的文件集规范化为通用格式,然后将其输出到hdfs中。 该框架将采用csv,parquet和avro不同格式的文件,每个文件具有不同的压缩方案。
我尝试使用以下代码获取文件并对其进行规范化。可以从流中正确读取CSV文件,但无法正确读取AVRO数据文件,从而在读取数据时会得到垃圾值。
// Receive streaming data from the source
JavaReceiverInputDStream < File > files = streamingContext.socketStream(
HOST,
PORT, in -> {
File file = File.createTempFile("Normalized ", String.valueOf(Instant.now().toEpochMilli()));
FileWriter fileWriter = new FileWriter(file, true);
List < File > out = new ArrayList < > ();
try (BufferedReader reader = new BufferedReader(new InputStreamReader( in , StandardCharsets.UTF_8))) {
for (String line;
(line = reader.readLine()) != null;) {
// System.out.println(line+" rrr____");
fileWriter.append(normalize(line)); // Normalizes each String and appends to a CSV file.
}
fileWriter.flush();
fileWriter.close();
}
out.add(file);
return out;
},
StorageLevel.DISK_ONLY());
正确打印CSV文件中的数据时,AVRO文件中的数据已损坏。
我写了一个类来测试我上面的代码的正常工作,以规范化文件,文件在套接字上连续发送以进行测试。
try (ServerSocket serverSocket = new ServerSocket(PORT);
Socket clientSocket = serverSocket.accept();
DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream());) {
byte[] buf = null;
int n = 0;
while (true) {
buf = new byte[4092];
FileInputStream fis = new FileInputStream(eventQueue.take()); //takes the file from queue and send it over network on a socket.
while ((n = fis.read(buf)) != -1) {
dos.write(buf, 0, n);
dos.flush();
}
}
} catch (IOException | InterruptedException e) {
throw new RuntimeException("Server error", e);
}
我的问题-
任何帮助和反馈将不胜感激。 谢谢