有沒有一種方法可以將一個scv文件轉換爲Avro而不使用Apache Spark。我看到大部分帖子都使用了火花,這在我的情況下是無法實現的。我有一個單獨的文件中的架構。我正在考慮一些使用Schema並將csv轉換爲avro的自定義序列化器和反序列化器。任何一種參考都適合我。 謝謝csv到avro沒有apache spark在斯卡拉
0
A
回答
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
相關問題
- 1. Apache Spark:問題與斯卡拉示例
- 2. 使用Apache Spark在斯卡拉的IntelliJ工作表
- 3. 斯卡拉Swing包沒有找到
- 4. 斯卡拉繼承值沒有找到
- 5. 斯卡拉Spark中的BinaryType支持
- 6. 文件沒有寫在斯卡拉
- 7. 斯卡拉在斯卡拉類
- 8. 在斯卡拉
- 9. 在斯卡拉
- 10. 在斯卡拉
- 11. 斯卡拉Spark中的ETL過程
- 12. 在斯卡拉
- 13. 比較與Spark和斯卡拉
- 14. 在斯卡拉
- 15. 在斯卡拉
- 16. 在斯卡拉
- 17. spark flatmap - 斯卡拉java代碼
- 18. 在斯卡拉
- 19. 在斯卡拉
- 20. 在斯卡拉
- 21. 在斯卡拉
- 22. 在斯卡拉
- 23. 在斯卡拉
- 24. 在斯卡拉
- 25. 在斯卡拉
- 26. 在斯卡拉
- 27. 在斯卡拉
- 28. 在斯卡拉
- 29. 在斯卡拉
- 30. 在斯卡拉
你如何在csv中表示嵌套結構,列表和地圖? – Dima
我根本沒有它,我的文件是RDBMS表的簡單提取。 – Explorer