2017-07-07 39 views
0

有沒有一種方法可以將一個scv文件轉換爲Avro而不使用Apache Spark。我看到大部分帖子都使用了火花,這在我的情況下是無法實現的。我有一個單獨的文件中的架構。我正在考慮一些使用Schema並將csv轉換爲avro的自定義序列化器和反序列化器。任何一種參考都適合我。 謝謝csv到avro沒有apache spark在斯卡拉

+0

你如何在csv中表示嵌套結構,列表和地圖? – Dima

+0

我根本沒有它,我的文件是RDBMS表的簡單提取。 – Explorer

回答

0

Avro是一個開放的格式,有many languages它支持它。

只需選擇一個,如python,例如也支持csv。但Go會做,Java也會。

1

如果你只有字符串和原語,你可以很輕鬆地放在一起粗實現這樣的:

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行的字段數相匹配的模式等

但字段數儘管有上述考慮,但這應該足以說明該方法並讓您開始。

+0

感謝您的回覆,我將分組分隔符作爲分隔符,因此理智檢查不是一個大問題。但是,我確實有空值,我需要處理,讓我試試你的方法。 – Explorer