Igo*_*gor 5 r apache-spark sparklyr
我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)
这是一个大数据集,约有580万条记录,我的数据集中包含类型数据Int,num以及chr.
我认为根据您使用的 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)
Run Code Online (Sandbox Code Playgroud)
Spark < 1.6.1 考虑 test.csv
1,a,4.1234567890
2,b,9.0987654321
Run Code Online (Sandbox Code Playgroud)
你可以轻松地提高效率,但我认为你明白了要点
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
Run Code Online (Sandbox Code Playgroud)
注意:SparkR::: 方法是私有的是有原因的,文档说“使用它时要小心”