Nikdy o tom som nepočul, ale stane sa tu:
Mám dátový rámec generovaný pomocou operácie sqlContext.sql v Scale. Pravdepodobne by malo byť 12 záznamov, ako je uvedené v jeho zdroji údajov mysql.
Keď používam:
result.show(7)
7 výsledky sú zobrazené normálne; Keď používam:
result.show(8)
Dostal som nasledujúcu chybu:
18/03/05 21:02:48 INFO HadoopRDD: Vstupné rozdelenie: HDFS: //nn01.itversity.com: 8020 / užívateľ / paslechoix / produkty / časť M-00000: 0 + 86996 18/03/05 21:02:48 INFO BlockManagerInfo: Odstránené broadcast_20_piece0 na localhost: 42892 v pamäti (veľkosť: 2008.0 B, zadarmo: 511.1 MB) 18/03/05 21:02:48 ERROR Executor: Výnimka v úlohe 0.0 v etape 19.0 (TID 22) java.lang.NumberFormatException: prázdny reťazec at sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1842) pri sun.misc.FloatingDecimal.parseFloat (FloatingDecimal.java:122)
Veľmi by som ocenil, keby mi niekto povedal, čo tu nie je?
Očakávaný výsledok z mysql je uvedený nižšie pre vašu referenciu:
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 |
+------------+---------------------+--------------------------------------------+---------------------+---------------+----------------------------------------------------------------------------+
Ak spustím nasledujúci skript:
val results12 = sqlContext.sql("SELECT * FROM products")
results12.show()
Vráti štandardne 20 záznamov bez chyby.
Ak potrebujete ďalšie informácie z chyby, dajte mi vedieť a ja uverejním celé chybové hlásenie. Ďakujem mnohokrát.
Aktualizácia 1:
Ak to urobím:
val result2 = sqlContext.sql("select * from products where productID = 379")
result2.show(1)
Zobrazí sa nasledujúca chyba:
java.lang.NumberFormatException: prázdny reťazec
Zdá sa, že problém spôsobuje 379.
Pokračujem s 377, rovnaké chybové hlásenie, keď show(1)
.
Nechápem však, že 377 je zahrnuté vo výsledku1:
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
odpovede:
1 pre odpoveď č. 1Nakoniec som túto otázku vyriešil.
V pôvodných údajoch sú záznamy s cenovým stĺpcom prázdnym, nie nulovým.
Takže keď sú dáta konvertované na RDD, chyby sa už vyskytli p.split ( "") (4) .toFloat v príkaze nižšie:
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)))
Riešením je prepísať 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)))
Týmto spôsobom zabezpečíme, že p (4) môže byť prevedený na Float.
Potom celý skript funguje podľa očakávania.
Ďakujem všetkým za osvietenie.
0 pre odpoveď č. 2
Môžem predpokladať java.lang.NumberFormatException: prázdny reťazec a sun.misc.FloatingDecimal.parseFloat (FloatingDecimal.java:122) že tieto môžu byť hlavnou príčinou problému. Možno nevyfiltrujete prázdne hodnoty. Pokúste sa ich vyfiltrovať pomocou nástroja DataFrame.na.fill (). Vidím na vašom df, že máte stĺpec product_price, ktorý je 1. kandidátom na spôsobenie problému, a preto sa pokúste spravovať prázdne hodnoty pre tento prvý. Napríklad :
df.na.fill(Map(
"product_price" -> 0.0
))