CSV в Авро без Apache искры в Скала
Есть ли способ, которым я могу конвертировать файл SCV в Avro без использования Apache Spark. Я вижу, что большая часть поста предлагает использовать искру, что я не могу в моем случае. У меня есть схема в отдельном файле. Я думал о каком-то настраиваемом сериализаторе и десериализаторе, который будет использовать схему и конвертировать csv в avro. Любая ссылка будет работать для меня. Спасибо
2 ответа
Если у вас есть только строки и примитивы, вы можете довольно просто собрать грубую реализацию, подобную этой:
def csvToAvro(file: Sting, schema: Schema) = {
val rec = new GenericData.Record(schema)
val types = schema
.getFields
.map { f => f.pos -> f.schema.getType }
Source.fromFile(file)
.getLines
.map(_.split("_").toSeq)
.foreach { data =>
(data zip types)
.foreach {
case (str, (idx, STRING)) => rec.put(idx, str)
case (str, (idx, INT)) => rec.put(idx, str.toInt)
case (str, (idx, LONG)) => rec.put(idx, str.toLong)
case (str, (idx, FLOAT)) => rec.put(idx, str.toFloat)
case (str, (idx, DOUBLE)) => rec.put(idx, str.toDouble)
case (str, (idx, BOOLEAN)) => rec.put(idx, str.toBoolean)
case (str, (idx, unknown)) => throw new IllegalArgumentException(s"Don't know how to convert $str to $unknown at $idx))
}
}
rec
}
Обратите внимание, что это не обрабатывает пустые поля: для тех, что тип будет UNION
и вам придется заглянуть внутрь схемы, чтобы узнать фактический тип данных.
Кроме того, "синтаксический анализ CSV" здесь очень грубый (просто разделение запятой не очень хорошая идея, потому что оно сломается, если в строковом поле окажется ,
в данных, или если поля экранированы двойными кавычками).
А также, возможно, вы захотите добавить некоторую проверку работоспособности, чтобы убедиться, например, в том, что количество полей в строке csv соответствует количеству полей в схеме и т. Д.
Но, несмотря на вышеизложенные соображения, этого должно быть достаточно, чтобы проиллюстрировать подход и начать работу.
Avro - открытый формат, есть много языков, которые его поддерживают.
Просто выберите один, например, Python, который также поддерживает CSV. Но Go будет делать, и Java также.