Есть ли способ преобразовать файл scv в Avro без использования Apache Spark. Я вижу, что в большинстве постов предлагается использовать искру, чего я не могу в моем случае. У меня есть схема в отдельном файле. Я думал о каком-то настраиваемом сериализаторе и десериализаторе, который будет использовать схему и конвертировать csv в avro. Для меня подойдут любые ссылки. Спасибо
csv в avro без apache spark в scala
Ответы (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
}
Примечание: это не обрабатывает поля, допускающие значение NULL: для них типом будет UNION
, и вам придется заглянуть внутрь схемы, чтобы узнать фактический тип данных.
Кроме того, "синтаксический анализ csv" здесь очень груб (просто разделение через запятую на самом деле не очень хорошая идея, потому что это сломается, если строковое поле будет содержать ,
в данных, или если поля будут экранированы двойными кавычками ).
Кроме того, вы, вероятно, захотите добавить некоторую проверку работоспособности, чтобы, например, убедиться, что количество полей в строке csv соответствует количеству полей в схеме и т. Д.
Но несмотря на приведенные выше соображения, этого должно быть достаточно, чтобы проиллюстрировать подход и начать работу.
Avro - это открытый формат, его поддерживает много языков.
Просто выберите один, например python, который также поддерживает csv. Но годится Go, и Java тоже.