簡體   English   中英

csv到scala中沒有apache火花的avro

[英]csv to avro without apache spark in scala

有沒有一種方法可以在不使用Apache Spark的情況下將scv文件轉換為Avro。 我看到大多數帖子都建議使用火花,在我的情況下我不能這樣做。 我在單獨的文件中有一個架構。 我在想一些自定義的序列化器和反序列化器,它們將使用Schema並將csv轉換為avro。 任何參考都對我有用。 謝謝

如果只有字符串和基元,則可以很容易地將這樣的粗略實現組合在一起:

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也可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM