В настоящее время я играю с java API Apache Arrow (хотя я использую его из Scala для примеров кода ), чтобы ознакомиться с этим инструментом.
В качестве упражнения я решил загрузить файл CSV в векторы стрелок, а затем сохранить их в файл стрелок. Первая часть показалась мне достаточно простой, и я попробовал вот так:
val csvLines: Stream[Array[String]] = <open stream from CSV parser>
// There are other types of allocator, but things work with this one...
val allocator = new RootAllocator(Int.MaxValue)
// Initialize the vectors
val vectors = initVectors(csvLines.head, allocator)
// Put their mutators into an array for easy access
val mutators = vectors.map(_.getMutator)
// Work on the data, zipping it with its index
Stream.from(0)
.zip(csvLines.tail) // Work on the tail (head contains the headers)
.foreach(rowTup => // rowTup = (index, csvRow as an Array[String])
Range(0, rowTup._2.size) // Iterate on each column...
.foreach(columnNumber =>
writeToMutator(
mutators(columnNumber), // get that column's mutator
idx=rowTup._1, // pass the current row number
data=rowTup._2(columnNumber) // pass the entry of the curernt column
)
)
)
С initVectors()
и writeToMutator()
, определенными как:
def initVectors(
columns: Array[String],
alloc: RootAllocator): Array[NullableVarCharVector] = {
// Initialize a vector for each column
val vectors = columns.map(colName =>
new NullableVarCharVector(colName, alloc))
// 4096 size, for 1024 values initially. This is arbitrary
vectors.foreach(_.allocateNew(2^12,1024))
vectors
}
def writeToMutator(
mutator: NullableVarCharVector#Mutator,
idx: Int,
data: String): Unit = {
// The CSV may contain null values
if (data != null) {
val bytes = data.getBytes()
mutator.setSafe(idx, bytes, 0, bytes.length)
}
mutator.setNull(idx)
}
(в настоящее время я не забочусь об использовании правильного типа и сохраняю все как строки или VarChar
в терминах стрелок)
Итак, на данный момент у меня есть коллекция NullableVarCharVector
, и я могу читать и писать из них / в них. На данный момент все отлично. Теперь, что касается следующего шага, мне осталось только задуматься о том, как на самом деле объединить их вместе и сериализовать в файл со стрелками. Я наткнулся на AbstractFieldWriter
абстрактный класс, но неясно, как использовать его реализации.
Итак, вопрос в основном таков:
- какой (лучший? - кажется, есть несколько) способ сохранить кучу векторов в файл со стрелками.
- есть ли другие способы загрузки столбцов CSV в векторы стрелок?
отредактировано для добавления: страница описания метаданных дает хороший общий обзор по этой теме.
Тестовые классы api, похоже, содержат несколько вещей, которые могут помочь, я отправлю ответ с образцом, как только попробую.