错误地将本地CSV读取到Spark数据集中



我有一个本地的csv" test.csv",其中第一行是列名,以下行是数据。我尝试在Java中这样的CSV阅读:

Dataset<Row> test_table = sparkSession()
    .sqlContext()
    .read()
    .format("com.databricks.spark.csv")
    .option("header", "true")
    .option("inferSchema", "true")
    .load("test.csv");

这里建议:
在Spark 1.6

中读取CSV作为数据框

,但我一直遇到错误:

java.lang.NegativeArraySizeException
    at com.univocity.parsers.common.input.DefaultCharAppender.<init>(DefaultCharAppender.java:39)
    at com.univocity.parsers.csv.CsvParserSettings.newCharAppender(CsvParserSettings.java:82)
    at com.univocity.parsers.common.ParserOutput.<init>(ParserOutput.java:93)
    at com.univocity.parsers.common.AbstractParser.<init>(AbstractParser.java:74)
    at com.univocity.parsers.csv.CsvParser.<init>(CsvParser.java:59)
    at org.apache.spark.sql.execution.datasources.csv.CsvReader.<init>(CSVParser.scala:49)
    at org.apache.spark.sql.execution.datasources.csv.CSVFileFormat.inferSchema(CSVFileFormat.scala:61)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:184)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:184)
    at scala.Option.orElse(Option.scala:289)
    at org.apache.spark.sql.execution.datasources.DataSource.org$apache$spark$sql$execution$datasources$DataSource$$getOrInferFileFormatSchema(DataSource.scala:183)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:387)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:135)

有什么问题,我该如何从CSV阅读到数据集?

在此处的Univocity-Parsers库的作者。之所以发生这种情况,是因为内部火花将最大值长度设置为-1(无限制)。这是在Univocity-Parsers版本中引入的2.2.0。

只需确保此库版本大于2.2.0,就可以了,因为较旧的版本不支持将maxCharsPerColumn属性设置为-1

如果您在类路径中有多个版本的库,请摆脱较旧的版本。理想情况下,您需要更新到最新版本(当前2.5.4。),仅使用它。当我们确保对库做出的任何更改都向后兼容时,它应该可以正常工作。

这主要是由于您使用的依赖项。尝试使用其他类似

   --packages com.databricks:spark-csv_2.10:1.5.0 or spark-csv_2.10:1.4.0 

它应该起作用。

相关内容

  • 没有找到相关文章

最新更新