在scala中没有apache spark的情况下将csv转换为avro

在scala中没有apache spark的情况下将csv转换为avro,scala,avro,avro4s,Scala,Avro,Avro4s,是否有一种方法可以将scv文件转换为Avro而不使用ApacheSpark。我看到大多数帖子都建议使用spark,但在我的案例中我无法做到。我在一个单独的文件中有一个模式。我正在考虑一些自定义序列化程序和反序列化程序,它们将使用模式并将csv转换为avro。任何类型的推荐信都适合我。 谢谢Avro是一种开放格式,有很多支持它的软件 只需选择一个,例如python,它也支持。但是Go也可以,Java也可以。如果您只有字符串和原语,那么您可以很容易地组合成这样一个粗糙的实现: def csvToAv

是否有一种方法可以将scv文件转换为Avro而不使用ApacheSpark。我看到大多数帖子都建议使用spark,但在我的案例中我无法做到。我在一个单独的文件中有一个模式。我正在考虑一些自定义序列化程序和反序列化程序,它们将使用模式并将csv转换为avro。任何类型的推荐信都适合我。
谢谢

Avro是一种开放格式,有很多支持它的软件


只需选择一个,例如python,它也支持。但是Go也可以,Java也可以。

如果您只有字符串和原语,那么您可以很容易地组合成这样一个粗糙的实现:

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行中的字段数与模式中的字段数匹配,等等


尽管有上述考虑,但这应该足以说明该方法并让您开始。

如何在csv中表示嵌套结构、列表和映射?我根本没有它,我的文件是RDBMS表的纯摘录。感谢您的回复,我将分组分隔符作为分隔符,因此健全性检查不是一个大问题。然而,我确实有空值,我需要处理,让我试试你的方法。