Запрос помощи по нижеуказанному вопросу. Мы извлекаем данные из Oracle, используя искру, и один из типов данных столбца является числом (28,5), для меньших значений он работает нормально, но если большие отрицательные значения, данные усекаются, как -544205937126085.125 преобразуется в -544205937126085.100 , Я пытался в местном, но проблема, и это дает ту же проблему.
import org.apache.spark.sql.SparkSession
object DecimalIssue {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().master("local")
.appName("Decimal Issue")
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
import spark.implicits._
val df = Seq((1234,1234.50),
(1234,-544205937126085.125 ),
(1234,200.567),
(1234,-200.567)
).toDF("smallvalue","bigvalue")
val df2 = df.select($"smallvalue",$"bigvalue".cast("decimal(28,5)"))
df2.show(10,false)
df2.printSchema()
}
}
и вывод кода выше.
+----------+----------------------+
|smallvalue|bigvalue |
+----------+----------------------+
|1234 |1234.50000 |
|1234 |-544205937126085.10000|
|1234 |200.56700 |
|1234 |-200.56700 |
+----------+----------------------+
root
|-- smallvalue: integer (nullable = false)
|-- bigvalue: decimal(28,5) (nullable = true)
В идеале я ищу вывод
+----------+----------------------+
|smallvalue|bigvalue |
+----------+----------------------+
|1234 |1234.50000 |
|1234 |-544205937126085.12500|
|1234 |200.56700 |
|1234 |-200.56700 |
+----------+----------------------+
root
|-- smallvalue: integer (nullable = false)
|-- bigvalue: decimal(28,5) (nullable = true)
РЕДАКТИРОВАТЬ: Даже положительные значения также дают усеченные результаты.
ДОБАВЛЕННЫЕ данные, такие как JSON СООБЩЕНИЕ
object DecimalIssue {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().master("local")
.appName("Decimal Issue")
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
// (1234, "1234.50"),
// (1234, "544205937126085.125"),
// (1234, "200.567"),
// (1234, "-200.567")
val customSchema = new StructType(Array(
StructField("smallvalue",LongType,true),
StructField("bigvalue",StringType,true)
))
import spark.implicits._
val data = "{\"smallvalue\":1234,\"bigvalue\":544205937126085.125}"
val df = Seq( data
).toDF("data")
val df1 = df.select(from_json($"data",customSchema).as("orig")).select("orig.*")
df1.show(10,false)
df1.printSchema()
val tryBigDecimal: String => BigDecimal = BigDecimal(_)
val bigUDF = udf(tryBigDecimal)
val bigDecimalUDF = udf(tryBigDecimal)
val df2 = df1.select($"smallvalue", bigUDF($"bigvalue").cast("decimal(28,5)"))
df2.show(10, false)
df2.printSchema()
}
}
Но дает те же результаты
Заранее спасибо.