2017-07-07 7 views
0

Apache Sparkを使用せずにscvファイルをAvroに変換する方法はありますか?私はポストのほとんどが私の場合はできないスパークを使用して示唆している参照してください。私は別のファイルにスキーマを持っています。私はスキーマを使用してcsvをavroに変換するカスタムシリアライザとデシリアライザを考えていました。どんな種類のリファレンスも私のために働くだろう。 ありがとうcsv avaなしでapache spark scala

+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 
} 

これはNULL可能フィールドを処理しない:それらのために型がUNIONになるだろう実際のデータ型を調べるには、スキーマを調べなければなりません。

また、 "csvの解析"は非常に粗いです(ちょうどコンマで区切ることは、文字列フィールドにデータ内に,が含まれている場合に破損するか、フィールドがエスケープされる二重引用符で囲みます)。

そしてまた、あなたはおそらくなどのCSV行のフィールドの数は、スキーマ内のフィールドの数と一致していること、例えば、いくつかの健全性チェックを確認するを追加したいと思う

しかし、上記の考慮事項にもかかわらず、これはアプローチを説明し始めるのに十分であるはずです。

+0

返信いただきありがとうございます、私は区切り記号として区切り記号をグループ化し、サニティチェックは大きな問題ではありません。しかし、私はNull値を持っているので、私は処理する必要があります、あなたのアプローチを試してみましょう。 – Explorer

関連する問題