Когда я пытаюсь написать одно и то же значение для каждой строки для строки в файле ORC, только первая строка возвращает письменное значение, при чтении оставшихся строк сталкивается с нулевым вопросом указателя. В некоторых случаях мы могли бы столкнуться с этой проблемой, поэтому ищу решение этой проблемы.import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.orc.CompressionKind;
import org.apache.orc.OrcFile;
import org.apache.orc.TypeDescription;
import org.apache.orc.impl.WriterImpl;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class ORCWriter {
public static void main(String[] args) throws IOException {
// Define the schema
TypeDescription schema = TypeDescription.createStruct()
.addField("value", TypeDescription.createString())
.addField("quality", TypeDescription.createLong());
// Create a configuration object
Configuration conf = new Configuration();
// Create a WriterImpl instance
WriterImpl writer = (WriterImpl) OrcFile.createWriter(new Path("testString.orc"),
OrcFile.writerOptions(conf).setSchema(schema).stripeSize(1024).compress(CompressionKind.SNAPPY));
// Create a batch to hold the data
VectorizedRowBatch batch = schema.createRowBatch();
BytesColumnVector value = (BytesColumnVector)batch.cols[0];
LongColumnVector quality = (LongColumnVector)batch.cols[1];
int start = 0;
int end = 100;
while (start < end) {
int row = batch.size++;
value.setVal(row, ("value").getBytes(StandardCharsets.UTF_8));
quality.vector[row] = start;
start += 1;
if (batch.size == batch.getMaxSize()) {
writer.addRowBatch(batch);
batch.reset();
}
}
if (batch.size != 0) {
writer.addRowBatch(batch);
batch.reset();
}
writer.close();
}
}
< /code>
orc reader logic: < /p>
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.orc.OrcFile;
import org.apache.orc.Reader;
import org.apache.orc.RecordReader;
import org.apache.orc.TypeDescription;
public class ORCReader {
public static void main(String[] args) throws Exception {
// Create a configuration object
Configuration conf = new Configuration();
// Create a Reader instance
Reader reader = OrcFile.createReader(new Path("testString.orc"),
OrcFile.readerOptions(conf));
// Get the schema of the ORC file
TypeDescription schema = reader.getSchema();
// Create a batch to hold the data
VectorizedRowBatch batch = schema.createRowBatch();
// Create a RecordReader to read the data
RecordReader rows = reader.rows();
int rowcount = 1;
long startTime = System.currentTimeMillis();
// Read the data
while (rows.nextBatch(batch)) {
BytesColumnVector value = (BytesColumnVector) batch.cols[0];
for (int r = 0; r < batch.size; ++r) {
String valueStr = new String(value.vector[r], value.start[r], value.length[r]);
System.out.println("Row " + rowcount + " value: " + valueStr);
rowcount++;
}
}
System.out.println("Total time :: "+(System.currentTimeMillis() - startTime));
// Close the RecordReader
rows.close();
}
}
< /code>
Подробная информация об исключении при попытке прочитать файл ORC: способное считывать значение из столбца значений без каких -либо проблем для первой строки и увидеть проблему с нулевым указателем из второй строки < /p>
ряд 1 Значение: значение < /p>
< /blockquote>
Исключение. Длина, потому что «байты» - это null
at java.base /java.lang.string.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... using-java
Я пишу повторяющиеся строковые значения в строковый столбец в файле ORC с использованием Java и при чтении файла ORC обр ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение