2017-02-05 11 views
0

Google Bigquery Hadoop Connectorを使用していて、テーブルの出力をjsonに保存しようとすると、結果として得られるjsonには実際に数字(IntsまたはLong)が文字列に変換されたフィールドがあります。 BigQueryの中に私のテーブルには、タイプ「整数」の1列「foo」を持っている場合GsonBigQueryInputFormatは文字列としてintsを保存します

例えば、出力JSONは

{"foo":"1234"} 

は、これは基本的に任意のJSONパーサーは、そのフィールドではなく、int型の文字列を持って読んで作るだろう。

私が使用してファイルを保存しています:

.newAPIHadoopRDD(
     hadoopConf, 
     classOf[GsonBigQueryInputFormat], 
     classOf[LongWritable], 
     classOf[JsonObject]) 

すべてのヘルプは本当にこの上でいただければ幸い、私は数日のためにそれに引っかかってきました!プロジェクトのあなたの貢献以来

Dennis、おそらくあなたはMoshaは整数型を持っていないJSONに関するコメントで述べたものの上に

+0

これは、JSONには整数型がないため、浮動小数点型として実装されている数値型のみであるため、BQ整数をJSON数値に変換すると精度が低下するからだと思います。それを文字列に変換しても精度は低下しませんが、整数に変換するアプリケーションが必要です。 –

+0

ありがとう@MoshaPasumanskyので、汎用のJSON文字列を取り込み、integer/double/floatに変換するメソッドを実装する必要がありますか? –

+0

はい、このメソッドは、精度が損なわれることなく、JSON数値にファーリングするのに整数が十分小さい場合にのみ機能します。 –

答えて

0

を助けることができ、あなたのケースでは、おそらく代わりにAvroBigQueryInputFormatを使用してみたいです。 Avroは正しい数値タイプをサポートします。

import org.apache.avro.generic.GenericData 
import com.google.cloud.hadoop.io.bigquery.AvroBigQueryInputFormat 
... 

// Load data from BigQuery. 
val tableData = sc.newAPIHadoopRDD(
    conf, 
    classOf[AvroBigQueryInputFormat], 
    classOf[LongWritable], 
    classOf[GenericData.Record]).cache 
関連する問題