我正在使用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:对于输入字符串:“”
为什么我在第二个代码中遇到异常,即使它与第一个代码相同?
答案 0 :(得分:2)
错误是由代码的第二部分中的echo $PATH
引起的
您需要使用_.split("|")
或_.split('|')
或_.split("\\|")
或_.split("""\|""")
如果您使用Pattern.quote("|")
,它会尝试使用正则表达式进行拆分,并且"|"
是或在正则表达式中,因此它不匹配任何内容并返回空字符串|
希望这有帮助!