开发者社区> 问答> 正文

案例类映射到csv

,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

展开
收起
社区小助手 2018-12-05 14:41:08 1398 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    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版本。

    2019-07-17 23:18:22
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多