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 также.

Другие вопросы по тегам