Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 查询大小数类型的大数值时为空_Apache Spark - Fatal编程技术网

Apache 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

我有一个简单的spark代码,如下所示,我想查询大量的大十进制类型

 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)