spark sql:选择DecimalType列的标度大于数字的行

问题描述 投票:0回答:1

我有一个数据框,其数据类型为DecimalType(38,10)。并非所有值都有10个十进制数字。我要选择缩放比例大于4的那些行(除去尾随的零后)。

有办法吗?

用伪代码,例如ds.select(col1, col2).where(col3.hasScale >4)

apache-spark-sql scale bigdecimal
1个回答
0
投票

这样的事情可以做到:

import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import org.apache.spark.sql.types.StringType;
import org.apache.spark.sql.types.DataTypes;

val scale = 10

val decimalType = DataTypes.createDecimalType(38, scale)

val data = Seq(
  Row(BigDecimal.decimal(3.302302)),
  Row(BigDecimal.decimal(3.4434)),
  Row(BigDecimal.decimal(4.32)),
  Row(BigDecimal.decimal(4.230240505)),
  Row(BigDecimal.decimal(7.302)),
  Row(BigDecimal.decimal(4.34444))
)

val schema = List(
  StructField("number", decimalType, true)
)

val df = spark.createDataFrame(
  spark.sparkContext.parallelize(data),
  StructType(schema)
)

df.show()

val multiplier = scala.math.pow(10, scale)
val min_scale = 4
val modulus = scala.math.pow(10, scale - min_scale)

df.filter(col("number").multiply(multiplier).mod(modulus).notEqual(0)).show()
© www.soinside.com 2019 - 2024. All rights reserved.