java.lang.NumberFormatException:对于输入字符串:“”在创建Dataframe时

时间:2017-07-26 05:18:24

标签: apache-spark apache-spark-sql

我正在使用cloudera vm。我已将retail_db的产品表作为textfile导入'|'作为字段分隔符(使用sqoop)。

以下是表架构:

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)

我想根据这些数据创建一个Dataframe。

使用以下代码时没有问题:

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:对于输入字符串:“”

为什么我在第二个代码中遇到异常,即使它与第一个代码相同?

1 个答案:

答案 0 :(得分:2)

错误是由代码的第二部分中的echo $PATH引起的

您需要使用_.split("|")_.split('|')_.split("\\|")_.split("""\|""")

如果您使用Pattern.quote("|"),它会尝试使用正则表达式进行拆分,并且"|"是或在正则表达式中,因此它不匹配任何内容并返回空字符串|

希望这有帮助!