2017-07-26 33 views
1

我正在使用cloudera虛擬機。我已將retail_db的產品表格作爲textfile'|'作爲字段分隔符(使用sqoop)導入。java.lang.NumberFormatException:對於輸入字符串:「」,同時創建數據幀

以下是表模式:

mysql> describe products; 
product_id: int(11) 
product_category_id: int(11) 
product_name: varchar(45) 
product_description: varchar(255) 
product_price: float 
product_image: varchar(255) 

我想創建這個數據的數據幀。

我沒有問題,而使用如下代碼:

var products = sc.textFile("/user/cloudera/ex/products").map(r => {var p = r.split('|'); (p(0).toInt, p(1).toInt, p(2), p(3), p(4).toFloat, p(5))}) 
case class Products(productID: Int, productCategory: Int, productName: String, productDescription: String, productPrice: Float, productImage: String) 
var productsDF = products.map(r => Products(r._1, r._2, r._3, r._4, r._5, r._6)).toDF() 

productsDF.show() 

但我得到了NumberFormatException exception爲下面的代碼:

case class Products (product_id: Int, product_category_id: Int, product_name: String, product_description: String, product_price: Float, product_image: String) 
val productsDF = sc.textFile("/user/cloudera/ex/products").map(_.split("|")).map(p => Products(p(0).trim.toInt, p(1).trim.toInt, p(2), p(3), p(4).trim.toFloat, p(5))).toDF() 
productsDF.show() 

java.lang.NumberFormatException:對於輸入字符串: 「」

爲什麼我在第二個代碼甚至t這跟第一個一樣嗎?

+0

你的輸入是什麼樣的? –

+0

1009 | 45 |鑽石恐懼無邪複合弓包|| 599.99 | http://images.acmesports.sports/Diamond+Fear+No+Evil+Compound+Bow+Package 1010 | 46 | DBX矢量系列男士尼龍Life Vest || 19.98 | http://images.acmesports.sports/DBX+Vector+Series+Men%27s+Nylon+Life+Vest – Ela

回答

1

的錯誤是由於_.split("|")在你的代碼的第二部分

你需要的,如果你使用"|"它試圖用正則表達式來分割使用_.split('|')_.split("\\|")_.split("""\|""")Pattern.quote("|")

|是或在正則表達式,所以它不匹配任何東西,並返回空字符串""

希望這有助於!

+0

非常感謝Shankar。它解決了這個問題。 – Ela

+0

感謝您接受爲答覆:) –

相關問題