Apache spark 查询大小数类型的大数值时为空
我有一个简单的spark代码,如下所示,我想查询大量的大十进制类型Apache spark 查询大小数类型的大数值时为空,apache-spark,Apache Spark,我有一个简单的spark代码,如下所示,我想查询大量的大十进制类型 test("SparkTest 0458") { val spark = SparkSession.builder().master("local").appName("SparkTest0456").getOrCreate() import spark.implicits._ val data = ( new java.math.BigDecimal("81902167530254
test("SparkTest 0458") {
val spark = SparkSession.builder().master("local").appName("SparkTest0456").getOrCreate()
import spark.implicits._
val data =
(
new java.math.BigDecimal("819021675302547012738064321"),
new java.math.BigDecimal("819021675302547012738064321"),
new java.math.BigDecimal("819021675302547012738064321")
)
val df = spark.createDataset(Seq(data)).toDF("a", "b", "c")
df.show(truncate = false)
}
但它显示了3个空值
+----+----+----+
|a |b |c |
+----+----+----+
|null|null|null|
+----+----+----+
我想问一下这里出了什么问题,谢谢问题的根源是十进制类型的模式推断机制。由于比例和精度都不是类型签名的一部分,Spark假定输入是
十进制(38,18)
:
这意味着您最多可以在小数点前存储20位数字,而您使用的数字有26位
据我所知,没有直接与反射一起工作的变通方法,但是可以将数据转换为行
对象,并显式地提供模式。例如,中间RDD
import org.apache.spark.sql.types_
导入org.apache.spark.sql.Row
导入java.math.BigDecimal
val schema=StructType(
Seq(“a”、“b”、“c”)映射(c=>StructField(c,DecimalType(38,0)))
)
spark.createDataFrame(
sc.parallelize(Seq(data))映射(t=>Row(t.productIterator.toSeq:*),
模式
)
或Kryo序列化数据集
import org.apache.spark.sql.{Encoder,Encoders}
导入org.apache.spark.sql.catalyst.encoders.RowEncoder
spark.createDataset(Seq(数据))(
Encoders.kryo:Encoder[(BigDecimal,BigDecimal,BigDecimal)]
).map(t=>Row(t.productIterator.toSeq:*)(RowEncoder(schema))
df.printSchema
root
|-- a: decimal(38,18) (nullable = true)
|-- b: decimal(38,18) (nullable = true)
|-- c: decimal(38,18) (nullable = true)