【问题标题】:Error when showing x amount of result for a Spark Dataframe显示 Spark 数据帧的 x 数量结果时出错
【发布时间】:2018-08-13 19:26:53
【问题描述】:

我从来没有听说过这个,但它发生在这里:

我有一个通过 Scala 中的 sqlContext.sql 操作生成的数据框。 想必它的mysql数据源中应该有12条记录。

当我使用时:

result.show(7)

7个结果正常显示; 当我使用:

result.show(8)

我收到以下错误:

18/03/05 21:02:48 信息 HadoopRDD:输入拆分: hdfs://nn01.itversity.com:8020/user/paslechoix/products/part-m-00000:0+86996 18/03/05 21:02:48 信息 BlockManagerInfo:删除了 broadcast_20_piece0 在 localhost:42892 内存中(大小:2008.0 B,免费:511.1 MB)18/03/05 21:02:48 错误执行程序:阶段 19.0 中的任务 0.0 异常(TID 22) java.lang.NumberFormatException: 空字符串 在 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842) 在 sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)

如果有人能告诉我这里出了什么问题,将不胜感激?

mysql 的预期结果如下供您参考:

    mysql> select * from products where product_name like 'Per%';
+------------+---------------------+--------------------------------------------+---------------------+---------------+----------------------------------------------------------------------------+
| product_id | product_category_id | product_name                               | product_description | product_price | product_image                                                              |
+------------+---------------------+--------------------------------------------+---------------------+---------------+----------------------------------------------------------------------------+
|        362 |                  17 | Perfect Fitness Perfect Ab Strap Pro       |                     |         29.99 | http://images.acmesports.sports/Perfect+Fitness+Perfect+Ab+Strap+Pro       |
|        365 |                  17 | Perfect Fitness Perfect Rip Deck           |                     |         59.99 | http://images.acmesports.sports/Perfect+Fitness+Perfect+Rip+Deck           |
|        372 |                  17 | Perfect Ab Carver Pro                      |                     |         39.99 | http://images.acmesports.sports/Perfect+Ab+Carver+Pro                      |
|        373 |                  17 | Perfect Fitness Multi Gym Pro              |                     |         39.99 | http://images.acmesports.sports/Perfect+Fitness+Multi+Gym+Pro              |
|        374 |                  17 | Perfect Pushup BASIC                       |                     |         19.99 | http://images.acmesports.sports/Perfect+Pushup+BASIC                       |
|        376 |                  17 | Perfect Pushup V2 Performance              |                     |         29.99 | http://images.acmesports.sports/Perfect+Pushup+V2+Performance              |
|        377 |                  17 | Perfect Pullup Basic                       |                     |         19.99 | http://images.acmesports.sports/Perfect+Pullup+Basic                       |
|        379 |                  17 | Perfect Multi-Gym - As Seen on TV!         |                     |         29.99 | http://images.acmesports.sports/Perfect+Multi-Gym+-+As+Seen+on+TV%21       |
|       1013 |                  46 | Perception Sport Swifty Deluxe 9.5 Kayak   |                     |        349.99 | http://images.acmesports.sports/Perception+Sport+Swifty+Deluxe+9.5+Kayak   |
|       1030 |                  46 | Perception Sport Striker 11.5 Angler Kayak |                     |        499.99 | http://images.acmesports.sports/Perception+Sport+Striker+11.5+Angler+Kayak |
|       1065 |                  48 | Perception Sport Swifty Deluxe 9.5 Kayak   |                     |        349.99 | http://images.acmesports.sports/Perception+Sport+Swifty+Deluxe+9.5+Kayak   |
|       1093 |                  49 | Perception Sport Swifty Deluxe 9.5 Kayak   |                     |        349.99 | http://images.acmesports.sports/Perception+Sport+Swifty+Deluxe+9.5+Kayak   |
+------------+---------------------+--------------------------------------------+---------------------+---------------+----------------------------------------------------------------------------+

如果我运行下面的脚本:

val results12 = sqlContext.sql("SELECT * FROM products") 
results12.show() 

它返回默认的 20 条记录,没有错误。

如果您需要有关错误的额外信息,请告诉我,我会发布完整的错误消息。非常感谢。

更新 1:

如果我这样做:

val result2 = sqlContext.sql("select * from products where productID = 379")
result2.show(1)

我收到以下错误:

java.lang.NumberFormatException: 空字符串

看来问题是由 379 引起的。

我继续 377,show(1) 时出现同样的错误消息。

但是我不明白 377 包含在 result1 中:

val result1 = sqlContext.sql("select * from products where name like 'Per%'")

scala> result1.show(7)

+---------+-----------+--------------------+--------+-----+--------------------+
|productID|productCode|                name|quantity|price|               image|
+---------+-----------+--------------------+--------+-----+--------------------+
|      362|         17|Perfect Fitness P...|        |29.99|http://images.acm...|
|      365|         17|Perfect Fitness P...|        |59.99|http://images.acm...|
|      372|         17|Perfect Ab Carver...|        |39.99|http://images.acm...|
|      373|         17|Perfect Fitness M...|        |39.99|http://images.acm...|
|      374|         17|Perfect Pushup BASIC|        |19.99|http://images.acm...|
|      376|         17|Perfect Pushup V2...|        |29.99|http://images.acm...|
|      377|         17|Perfect Pullup Basic|        |19.99|http://images.acm...|
+---------+-----------+--------------------+--------+-----+--------------------+
only showing top 7 rows

【问题讨论】:

  • 有一个 {} 按钮可以将一段文本转换为代码块(通过缩进四),这对于 SQL 输出和错误回溯都效果更好。
  • 在编辑问题时,别忘了再添加一两个有用的标签。
  • 尽量减少你的问题,找到导致问题的一行(假设它是一行),然后查看错误消息,查看该行,看看是否有意义。
  • 谢谢你。
  • 好多了,你。两个快速的问题可以尝试进一步缩小问题:

标签: scala apache-spark apache-spark-sql


【解决方案1】:

我终于解决了这个问题。

原始数据中有price列为空,不为null的记录。

因此,当数据转换为 RDD 时,由于以下命令中的 p.split(",")(4).toFloat,它已经出错了:

val prdRDD = prd.map(p=>(p.split(",")(0).toInt, p.split(",")(1), p.split(",")(2), p.split(",")(3), p.split(",")(4).toFloat,p.split(",")(5)))

解决方法是将prdRDD重写为:

val prdRDD = prd.map(p=>p.split(",")).map(p=>(p(0).toInt, p(1), p(2), p(3), { if( p(4)==null ||  p(4)=="" ) p(4)=0 else p(4).toFloat },p(5)))

这样可以确保 p(4) 可以转换为浮点数。

之后整个脚本按预期工作。

谢谢大家的指教。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2017-01-16
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2022-12-10
    • 2017-04-15
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多