,dept_name
1,acc
2,finance
3,sales
4,marketing
当在df.show()和rdd.toDF.show()中使用时,为什么show()的输出存在差异。
scala> case class Department (dept_id: Int, dept_name: String)
defined class Department
scala> val dept = sc.textFile("/home/sam/Projects/department")
scala> val mappedDpt = dept.map(p => Department( p(0).toInt,p(1).toString))
scala> mappedDpt.toDF.show() | |
---|---|
dept_id | dept_name |
49 | , |
50 | , |
51 | , |
52 | , |
scala>
val dept_df = spark.read
.format("csv")
.option("header","true")
.option("inferSchema","true")
.option("mode","permissive")
.load("/home/sam/Projects/department")
scala> dept_df.show() | |
---|---|
dept_id | dept_name |
1 | acc |
2 | finance |
3 | sales |
4 | marketing |
val mappedDpt = dept.map(p => Department( p(0).toInt,p(1).toString))
p这是一个字符串而不是一行 (你可能认为)。更精确的p是这里是文本文件的每一行,你可以确认读取scaladoc。
“ 返回文本文件行的RDD”。
因此,当您应用apply方法((0))时,您将按行上的位置访问字符。
这就是为什么你"49, ','"从toInt第一个字符串中得到49,它返回字符的ascii值和','行上的第二个字符。
编辑
如果需要重现该read方法,可以执行以下操作:
object Department {
/* The Option here is to handle errors. /
def fromRawArray(data: Array[String]): Option[Department] = data match {
case Array(raw_dept_id, dept_name) => Some(Department(raw_dept_id.toInt, dept_name))
case _ => None
}
}
// We use flatMap instead of map, to unwrap the values from the Option, the Nones get removed.
val mappedDpt = dept.flatMap(line => Department.fromRawArray(line.split(",")))
但是,我希望这只是为了学习。在生产代码上,你应该一直使用该read版本。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。