/ / Błąd przy wyświetlaniu x ilości wyników dla Dataframe Spark - scala, apache-spark, apache-spark-sql

Błąd przy wyświetlaniu x ilości wyników dla Dataframe Spark - scala, apache-spark, apache-spark-sql

Nigdy o tym nie słyszałem, ale dzieje się to tutaj:

Mam frameworka generowane przez operację sqlContext.sql w Scala. Przypuszczalnie powinno być 12 rekordów, jak pokazano w jego źródle danych mysql.

Kiedy używam:

result.show(7)

7 wyników pokazuje się normalnie; Kiedy używam:

result.show(8)

Otrzymałem następujący błąd:

18/03/05 21:02:48 INFO HadoopRDD: Podział wejścia: hdfs: //nn01.itversity.com: 8020 / user / paslechoix / products / part-m-00000: 0 + 86996 18/03/05 21:02:48 INFO BlockManagerInfo: Usunięto broadcast_20_piece0 na localhost: 42892 w pamięci (rozmiar: 2008.0 B, darmowy: 511,1 MB) 18/03/05 21:02:48 ERROR Executor: Wyjątek w zadaniu 0.0 na etapie 19.0 (TID 22) java.lang.NumberFormatException: empty String at sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1842) at sun.misc.FloatingDecimal.parseFloat (FloatingDecimal.java:122)

Byłoby bardzo cenne, gdyby ktoś mógł mi powiedzieć, co jest tutaj nie tak?

Spodziewany wynik z mysql jest następujący:

    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   |
+------------+---------------------+--------------------------------------------+---------------------+---------------+----------------------------------------------------------------------------+

Jeśli uruchomię poniższy skrypt:

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

Zwraca domyślne 20 rekordów bez błędu.

Jeśli potrzebujesz dodatkowych informacji z błędu, daj mi znać, a opublikuję pełny komunikat o błędzie. Dziękuję Ci bardzo.

Aktualizacja 1:

Jeśli zrobię:

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

Pojawia się następujący błąd:

java.lang.NumberFormatException: empty String

Wygląda na to, że 379 powoduje problem.

Kontynuuję z 377, ten sam komunikat o błędzie, kiedy show(1).

Jednak nie rozumiem, że 377 jest zawarty w wyniku 1:

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

Odpowiedzi:

1 dla odpowiedzi № 1

W końcu rozwiązałem ten problem.

W oryginalnych danych istnieją zapisy, w których kolumna ceny jest pusta, a nie pusta.

Tak więc, gdy dane są konwertowane na RDD, błędy już z powodu p.split (",") (4) .toFloat w poleceniu poniżej:

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)))

Rozwiązaniem jest przepisanie prdRDD na:

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)))

W ten sposób można przekonwertować p (4) na Float.

Następnie cały skrypt działa zgodnie z oczekiwaniami.

Dziękuję wszystkim za oświecenie.


0 dla odpowiedzi nr 2

Mogę założyć od java.lang.NumberFormatException: empty String i sun.misc.FloatingDecimal.parseFloat (FloatingDecimal.java:122) to może być główna przyczyna problemu. Może nie odfiltrowujesz pustych wartości. Spróbuj odfiltrować je za pomocą DataFrame.na.fill (). Widzę na twoim df, że masz kolumnę product_price, która jest pierwszym kandydatem powodującym problem, dlatego spróbuj najpierw zarządzać pustymi wartościami. Na przykład :

df.na.fill(Map(
"product_price" -> 0.0
))