【问题标题】:Sparklyr - Decimal precision 8 exceeds max precision 7Sparklyr - 小数精度 8 超过最大精度 7
【发布时间】:2017-12-09 11:32:43
【问题描述】:

我正在尝试使用 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 类型的数据。

【问题讨论】:

    标签: r apache-spark sparklyr


    【解决方案1】:

    我认为您有几个选择,具体取决于您使用的 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)
    

    火花 考虑 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::: 方法是私有的是有原因的,文档说“使用时要小心”

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多