在Scala Spark中执行时发生异常-java.lang.NumberFormatException:对于输入字符串;卷;

在Scala Spark中执行时发生异常-java.lang.NumberFormatException:对于输入字符串;卷;,scala,apache-spark,numberformatexception,Scala,Apache Spark,Numberformatexception,我在执行下面的代码段时遇到异常。 我使用的数据集是“stocks.csv”和 其中包含日期、符号、体积、打开、关闭、高、低和关闭列 val stock = sc.textFile("C:/Users/kondr/Desktop/stocks/stocks.csv") val splits = stock.map(record => record.split(",")) val symvol = splits.map(

我在执行下面的代码段时遇到异常。 我使用的数据集是“stocks.csv”和 其中包含日期、符号、体积、打开、关闭、高、低和关闭列

    val stock = 
    sc.textFile("C:/Users/kondr/Desktop/stocks/stocks.csv")
    val splits = stock.map(record => record.split(","))
    val symvol = splits.map(arr => (arr(1),arr(2).toInt))
    val maxvol = symvol.reduceByKey((vol1,vol2) => 
    Math.max(vol1,vol2),1)
    maxvol.collect().foreach(println)
错误消息

21/05/05 14:09:31错误执行者:第2.0阶段(TID 2)任务0.0中出现异常 java.lang.NumberFormatException:用于输入字符串:“卷”
在java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

下面是跳过第一行的方法

stock.zipWithIndex().filter(_._2 != 0)
  .map(_._1)
  .map(record => record.split(" "))
  .map(arr => (arr(1),arr(2).toInt))
  .reduceByKey((vol1,vol2) => Math.max(vol1,vol2),1)
或者您可以直接将其读取到dataframe,如下所示

val csvDF = spark.read
  .option("header", true)
  .option("delimiter", " ")
  .csv("stock.txt")

csvDF.show(false)
输出:

+----------+------+-------+-----------+-----------+-----------+-----------+-----------+
|date      |symbol|volume |open       |close      |high       |low        |adjclose   |
+----------+------+-------+-----------+-----------+-----------+-----------+-----------+
|18-04-2019|A     |2874100|75.73000336|76.16999817|76.54000092|75.30999756|76.16999817|
|17-04-2019|A     |4472000|78.15000153|75.43000031|78.31999969|74.45999908|75.43000031|
|16-04-2019|A     |3441500|80.81999969|77.55000305|80.95999908|77.19000244|77.55000305|
|15-04-2019|A     |1627300|81         |80.40000153|81.12999725|79.91000366|80.40000153|
|12-04-2019|A     |1249300|81.43000031|80.98000336|82.05999756|80.90000153|80.98000336|
+----------+------+-------+-----------+-----------+-----------+-----------+-----------+

你能分享你的样本数据吗?看起来csv文件中有标题。为什么不直接将其作为数据帧读取为`val df=spark.read.csv(“parh”)`Hi@koiralo,非常感谢您的回复。以下是示例数据。日期符号成交量开盘-收盘-高位-低位调整-收盘18-04-2019 A 2874100 75.73000336 76.16999817 76.54000092 75.30999756 76.16999817 17-04-2019 A 4472000 78.15000153 75.43000031 78.31999969 74.459990875.43000031 16-04-2019 A 3441500 80.819996977.5500030580.95990877.190002447.0030515-04-2019 A 1627300 81 80.40000153 81.12999725 79.91000366 80.40000153 12-04-2019 A 1249300 81.43000031 80.9800336 82.05999756 80.90000153 80.9800336hi@koiralo,我也尝试过.txt文件格式。这是我使用“\t”进行拆分的示例代码。在第一行中,字符串为
日期符号volume open-close high-low adjclose
,无法转换为integerHi@koiralo,上述解决方案效果良好。但是,我现在还不熟悉Spark,我真的很想看看DAG,当我们应用像map这样的转换时,Spark在内部是如何工作的。。。因此,我开始使用sc.textFile(),然后在调用collect操作之前将RDD转换为映射转换两次。有没有办法用Spark Core而不是DF来处理它。嗨@koiralo,我已经通过修改您建议的代码来尝试下面的代码。它很好用。但它只返回一个符号和它的最大容量。请你帮忙好吗。val stock=sc.textFile(“C:/Users/kondr/Desktop/stocks.csv”).zipWithIndex().filter(..u2==1.map(..u1)val splits=stock.map(record=>record.split(,”)val symvol=splits.map(arr=>(arr(1),arr(2.toInt))val maxvol=symvol.reduceByKey((vol1,vol2)=>Math.max(vol1,vol2))maxvol.collect().foreach(println)它应该是这样的
val stock=spark.sparkContext.textFile(“C:/Users/kondr/Desktop/stocks.csv”).zipWithIndex().filter(u.2==1).map(uu.1)val splits=stock.map(record=>record.split(“,”)val symvol=splits.map(arr=>(arr=>(1),arr(2.toInt))val maxvol=symvol.reduceByKey((vol1,vol2)=>Math.max(vol1,vol2))maxvol.collect().foreach(println)
如果答案有帮助,你能把它标记为答案吗?如果你还有其他问题,请另问一个问题。hi@koiralo为不同的问题创建了一个新问题。希望这对解决问题有帮助。谢谢