在Scala Spark中执行时发生异常-java.lang.NumberFormatException:对于输入字符串;卷;
我在执行下面的代码段时遇到异常。 我使用的数据集是“stocks.csv”和 其中包含日期、符号、体积、打开、关闭、高、低和关闭列在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(
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为不同的问题创建了一个新问题。希望这对解决问题有帮助。谢谢