r - Sparklyr - 小数精度 8 超过最大精度 7

标签 r apache-spark sparklyr

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

Error: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 16.0 failed 4 times, most recent failure: Lost task 0.3 in stage 16.0 (TID 176, 10.1.2.235): java.lang.IllegalArgumentException: requirement failed: Decimal precision 8 exceeds max precision 7

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

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

最佳答案

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

Spark >=1.6.1

来自这里:https://docs.databricks.com/spark/latest/sparkr/functions/read.df.html 看来,您可以专门指定您的模式以强制它使用 double

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 考虑 test.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:::方法是私有(private)的是有原因的,文档说“使用它时要小心”

关于r - Sparklyr - 小数精度 8 超过最大精度 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44932305/

相关文章:

apache-spark - Apache Spark java.lang.ClassNotFoundException

java - java中的spark流与mongodb

r - 使用 sparklyr 将列数据类型更改为因子

r - 将行转换为列,根据另一列使用后缀重复列名

r - R 中的 Newtonraphson 代码会导致不同的结果

r - 来自load.wave的不完整的wav文件,由save.wave保存

scala - 使用 Spark Scala 将数据插入到带有 HiveContext 的 Hive 表中

r - Sparklyr:sdf_copy_to失败,包含350 MB数据集

sparklyr 堆空间不足,但内存充足

r - 是否有更简洁的方法来子集和提取 R 数据集中最早的诊断和代码?