【问题标题】:csv to avro without apache spark in scalascala中没有apache spark的csv到avro
【发布时间】:2017-07-07 13:33:31
【问题描述】:

有没有一种方法可以在不使用 Apache Spark 的情况下将 scv 文件转换为 Avro。我看到大多数帖子都建议使用 spark ,但在我的情况下我不能。我在单独的文件中有一个架构。我正在考虑一些自定义序列化器和反序列化器,它们将使用 Schema 并将 csv 转换为 avro。任何类型的参考都对我有用。 谢谢

【问题讨论】:

  • 如何在 csv 中表示嵌套结构、列表和映射?
  • 我根本没有,我的文件是 RDBMS 表的普通提取。

标签: scala avro avro4s


【解决方案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 行中的字段数与架构中的字段数等匹配。

尽管有上述考虑,但这应该足以说明方法并帮助您入门。

【讨论】:

  • 感谢您的回复,我将分隔符分组为分隔符,因此完整性检查不是一个大问题。但是我确实有 Null 值并且我需要处理,让我试试你的方法。
【解决方案2】:

Avro 是一种开放格式,有many languages 支持。

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

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2019-07-03
    • 2020-08-23
    相关资源
    最近更新 更多