2017-01-23 5 views
1

Oracle(11g)データベーステーブルをHDFS(Avroフォーマット)に変換するのにNiFiを使用しています。Oracle + NiFi =>すべてのフィールドが文字列に変換されました

AVRO列の入力に問題が発生します.Aracle列の型がNumeric、Timestamp of Datetimeなどの別の型の場合でも、これらはすべてStringとして定義されます。明らかに、これは面倒です:-)

いくつかのグーグルの後で、特定のOracle JDBCドライバとAvroへのコンバータの組み合わせに問題があることがわかりました。しかし、私は適切な解決策を見つけることができませんでした。誰でもJDBC(または他の?)ドライバを使用してAvro出力に正しいタイピングをすることを知っていますか?

私は、ドライバが働くと言ってOracleを使用しての経験を持っていないが、それはNiFiで正常に動作ためにドライバが列の型を取得するためのResultSetMetaDataを使用してサポートする必要がある

答えて

0

私は予期しない動作の説明を見つけた:

  1. Oracleは、NUMBERを使用する列がINTで定義されている場合でも、[1](この は私が推測する、運転席側の問題ではありません。)
  2. 2JDBCドライバはNumberをBigDecimalにマッピングします
  3. NiFi実装ではBigDecimalをStringにマッピングします。その時点で AvroはAvro 1.8.1までBigDecimalマッピングをサポートしていませんでした。 Current NiFiはAvro 1.7.7を使用します。 Avro 1.8.1では、LogicalType [2]を使用して、BigDecimalまたはDateをよりユーザーフレンドリな方法でマップできます。
  4. LogicalType メカニズムを使用するためのNiFiプロジェクト[3]には、適切なデータ型を使用してより多くのデータ型をマッピングできるように、継続的な努力がなされています。

つまり、この問題が修正された次のリリースを待つ必要があるようです。

2

ドライバがBryanが提案した(またはNiFiが文字列として扱う未知の型の)各列の型として "string"を返す場合、プリミティブ型の変換(文字列、 long、int、double、float)を使用すると、ConvertAvroSchemaプロセッサを試すことができます。

日付/時刻フィールドには、何をしたいかによって、NiFi表現言語でDate Manipulation functionsというものがあります。

+0

入力いただきありがとうございます。しかし、あなたが提案するものは、(持続不可能な)回避策です。 –

+0

はい、私はhttps://issues.apache.org/jira/browse/NIFI-2624が実装されるまで回避策を提案していました。 – mattyb

関連する問題