R语言 SparklyR语言 十进制精度 8 超过最大精度 7



我正在尝试使用 spark_read_csv 将一个大型数据库复制到 Spark 中,但我收到以下错误作为输出:

错误:org.apache.spark.SparkException:作业由于阶段而中止 失败:阶段 16.0 中的任务 0 失败 4 次,最近一次失败: 阶段 16.0 中丢失的任务 0.3(TID 176、10.1.2.235): java.lang.IllegalArgumentException: 要求失败: 十进制 精度 8 超过最大精度 7

data_tbl <- spark_read_csv(sc, "data", "D:/base_csv", delimiter = "|", overwrite = TRUE)

这是一个大数据集,大约有 580 万条记录,我的数据集有Intnumchr类型的数据。

我认为您有几个选择,具体取决于您使用的 Spark 版本

火花>=1.6.1

从这里: https://docs.databricks.com/spark/latest/sparkr/functions/read.df.html 似乎,您可以专门指定您的架构以强制它使用双精度

csvSchema <- structType(structField("carat", "double"), structField("color", "string"))
diamondsLoadWithSchema<- read.df("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv",
source = "csv", header="true", schema = csvSchema)

Spark <1.6.1考虑测试.csv

1,a,4.1234567890
2,b,9.0987654321

你可以很容易地使它更有效率,但我认为你明白了要点

linesplit <- function(x){
tmp <- strsplit(x,",")
return ( tmp)
}
lineconvert <- function(x){
arow <- x[[1]]
converted <- list(as.integer(arow[1]), as.character(arow[2]),as.double(arow[3]))
return (converted)
}
rdd <- SparkR:::textFile(sc,'/path/to/test.csv')
lnspl <- SparkR:::map(rdd, linesplit)
ll2 <- SparkR:::map(lnspl,lineconvert)
ddf <- createDataFrame(sqlContext,ll2)
head(ddf)
_1 _2           _3
1  1  a 4.1234567890
2  2  b 9.0987654321

注意:SparkR::: 方法是私有的,这是有原因的,文档说"使用它时要小心">

最新更新