2017-03-06 17 views
1

私のavroスキーマでは、 "TOT_AMT"型を "bytes"型と論理型 "decimal"として定義しました。私は和関数を使用TOT_AMTカラムを合計しようとしたとき、それはエラーを「関数和がBinarytypeない数値型を必要とする」スロー、火花アブロdatabricksを用いてスパークのデータフレームを作成した後Avroのバイト列(10進数の論理型付き)を10進数に変換する方法は?

カラムを

名= "TOT_AMT"、 "タイプ"、アブロスキーマで以下のように定義される: "NULL"、{ "タイプ": "バイト"、 "logicaltype": "小数" 、 "精度" 20、 "スケール":10}]

Iがデータフレームを作成し、同様に加算AM、

val df=sqlContext.read.format("com.databricks.spark.avro").load("input dir") 
df.agg(sum("TOT_AMT")).show() 

データフレームを作成しながら、小数値がBinarytypeとして読み出されると思われます。このような場合、そのような小数点以下の桁でどのように数値演算を実行できますか?このByte配列をBigDecimalに変換してから計算を実行することは可能でしょうか?

+0

データのスケマティックコードまたは概要を提供できますか?特に、削減前の現在のRDDの状態が重要になる可能性があります。明示的な型キャスティングは、おそらくトリックを行うでしょう。 – dennlinger

答えて

0

Supported types for Avro -> Spark SQL conversionによると、bytesアブロ型は、SQLのBinaryTypeを(もthe code参照)スパークに変換されます。あなたがavroSchemaオプションを使用して、独自のカスタムスキーマを定義することができますthe source codeによると

、すなわち

あなた BinaryTypeから Decimalへのマッピングを指定する方法を提供します
spark.read 
    .format("com.databricks.spark.avro") 
    .option("avroSchema", yourSchemaHere) 

cast関数を使用して、バイナリ値を10進数形式にキャストすることもできます。

p.s.読者がAvroスキーマで定義されたlogicaltypeヒントをサポートしているかどうかはわかりません。現在利用可能でない場合は、このような機能を持つのが良いでしょう。

関連する問題