csv в avro без apache spark в scala

Есть ли способ преобразовать файл scv в Avro без использования Apache Spark. Я вижу, что в большинстве постов предлагается использовать искру, чего я не могу в моем случае. У меня есть схема в отдельном файле. Я думал о каком-то настраиваемом сериализаторе и десериализаторе, который будет использовать схему и конвертировать csv в avro. Для меня подойдут любые ссылки. Спасибо


person Explorer    schedule 07.07.2017    source источник
comment
как вы представляете вложенные структуры, списки и карты в CSV?   -  person Dima    schedule 07.07.2017
comment
У меня его просто нет, мой файл представляет собой простой фрагмент таблицы СУБД.   -  person Explorer    schedule 07.07.2017


Ответы (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 соответствует количеству полей в схеме и т. Д.

Но несмотря на приведенные выше соображения, этого должно быть достаточно, чтобы проиллюстрировать подход и начать работу.

person Dima    schedule 07.07.2017
comment
спасибо за ваш ответ, я разделитель групп в качестве разделителя, поэтому проверка работоспособности не является большой проблемой. Однако у меня есть значения Null, и с которыми мне нужно будет справиться, позвольте мне попробовать ваш подход. - person Explorer; 07.07.2017

Avro - это открытый формат, его поддерживает много языков.

Просто выберите один, например python, который также поддерживает csv. Но годится Go, и Java тоже.

person Setop    schedule 07.07.2017