scala - 创建 Dataframe 时的 DecimalType 问题

标签 scala apache-spark dataframe

当我尝试使用十进制类型创建数据框时,它抛出了以下错误。

我正在执行以下步骤:

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._;


//created a DecimalType
val DecimalType = DataTypes.createDecimalType(15,10)

//创建架构
val sch = StructType(StructField("COL1",StringType,true)::StructField("COL2",**DecimalType**,true)::Nil)

val src = sc.textFile("test_file.txt")
val row = src.map(x=>x.split(",")).map(x=>Row.fromSeq(x))
val df1= sqlContext.createDataFrame(row,sch)

df1 的创建没有任何错误。但是,当我作为 df1.collect() 操作发出时,它给了我以下错误:
scala.MatchError: 0 (of class java.lang.String)
    at org.apache.spark.sql.catalyst.CatalystTypeConverters$DecimalConverter.toCatalystImpl(CatalystTypeConverters.scala:326)

test_file.txt 内容:
test1,0
test2,0.67
test3,10.65
test4,-10.1234567890

我创建 DecimalType 的方式有什么问题吗?

最佳答案

您应该有一个 BigDecimal 实例来转换为 DecimalType

val DecimalType = DataTypes.createDecimalType(15, 10)
val sch = StructType(StructField("COL1", StringType, true) :: StructField("COL2", DecimalType, true) :: Nil)

val src = sc.textFile("test_file.txt")
val row = src.map(x => x.split(",")).map(x => Row(x(0), BigDecimal.decimal(x(1).toDouble)))

val df1 = spark.createDataFrame(row, sch)
df1.collect().foreach { println }
df1.printSchema()

结果如下所示:
[test1,0E-10]
[test2,0.6700000000]
[test3,10.6500000000]
[test4,-10.1234567890]
root
 |-- COL1: string (nullable = true)
 |-- COL2: decimal(15,10) (nullable = true)

关于scala - 创建 Dataframe 时的 DecimalType 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45706764/

相关文章:

scala - 如何强制解释器显示完整的堆栈跟踪?

java - 使用 GSON(或任何其他库)将 JSON 转换为 Java/Scala -> Bean 结构不清楚

scala - 在 Spark/Scala 中将 RDD 转换为数据帧

java - 将 iterable 转换为 RDD

python - 无法转置 dask.dataframe - 获取未绑定(bind)本地错误

scala - 返回动态类型的函数

java - 是否有用于解析 gettext PO 文件的 Java 库?

scala - 将无效数据设置为 Spark DataFrames 中的缺失数据

r - 如何在 R 中的数据框中的每个可能的行组合上应用多个函数?

python - 创建一个循环来找出前 20 天内的销售数量