Json GsonBigQueryInputFormat将整数保存为字符串

Json GsonBigQueryInputFormat将整数保存为字符串,json,hadoop,apache-spark,google-bigquery,Json,Hadoop,Apache Spark,Google Bigquery,我一直在使用GoogleBigQueryHadoop连接器,在尝试将表的输出保存为json时,结果json中的字段实际上是转换为字符串的数字(整数或长整数) 例如,如果Bigquery中的我的表有一列“foo”类型为“Integer”,那么输出json将是 {"foo":"1234"} 这基本上使任何json解析器读取该字段的字符串,而不是int 我正在使用以下命令保存文件: .newAPIHadoopRDD( hadoopConf, classOf[GsonB

我一直在使用GoogleBigQueryHadoop连接器,在尝试将表的输出保存为json时,结果json中的字段实际上是转换为字符串的数字(整数或长整数)

例如,如果Bigquery中的我的表有一列“foo”类型为“Integer”,那么输出json将是

{"foo":"1234"}
这基本上使任何json解析器读取该字段的字符串,而不是int

我正在使用以下命令保存文件:

.newAPIHadoopRDD(
        hadoopConf,
        classOf[GsonBigQueryInputFormat],
        classOf[LongWritable],
        classOf[JsonObject])
如果你能帮上忙,我会非常感激的,我已经坚持了好几天了


由于您是项目的参与者,也许您可以在Mosha在关于JSON没有整数类型的评论中提到的内容的基础上提供帮助,在您的情况下,您可能希望尝试使用。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

我认为这是因为JSON没有整数类型,只有数字类型实现为浮点,所以将BQ整数转换为JSON数字将失去精度。将其转换为字符串不会失去精度,但需要应用程序将其转换回整数。感谢@MoshaPasumansky,所以我必须实现一个方法,该方法接受通用JSON字符串并将其转换为整数/双精度/浮点值?是的,虽然这种方法只有在整数足够小,可以在不损失精度的情况下转换为JSON数字时才有效。那么Scala中使用的最佳数据类型是什么呢?双重的浮动?难道你不能用直接调用“toLong()”`在弦上?BigQuery返回的整数值应该在Scala的
long
类型的范围内。我认为这个答案应该可以解决我的问题,但面临的错误是:对象不可序列化(类:org.apache.avro.generic.GenericData$Record)