我有一个本地的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
,但我一直遇到错误:
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
它应该起作用。