【发布时间】:2019-11-14 14:43:42
【问题描述】:
您能在这个火花概率声明中提供帮助吗
数据 -
empno|ename|designation|manager|hire_date|sal|deptno
7369|SMITH|CLERK|9902|2010-12-17|800.00|20
7499|ALLEN|SALESMAN|9698|2011-02-20|1600.00|30
代码:
val rawrdd = spark.sparkContext.textFile("C:\\Users\\cmohamma\\data\\delta scenarios\\emp_20191010.txt")
val refinedRDD = rawrdd.map( lines => {
val fields = lines.split("\\|") (fields(0).toInt,fields(1),fields(2),fields(3).toInt,fields(4).toDate,fields(5).toFloat,fields(6).toInt)
})
问题陈述 - 这不起作用 -fields(4).toDate ,有什么替代方案或用途是什么?
我尝试了什么?
- 尝试将其替换为 - to_date(col(fields(4)) , "yyy-MM-dd") - 不工作
2.
第 1 步。
val refinedRDD = rawrdd.map( lines => {
val fields = lines.split("\\|")
(fields(0),fields(1),fields(2),fields(3),fields(4),fields(5),fields(6))
})
现在这个元组都是字符串
第 2 步。
mySchema = StructType(StructField(empno,IntegerType,true), StructField(ename,StringType,true), StructField(designation,StringType,true), StructField(manager,IntegerType,true), StructField(hire_date,DateType,true), StructField(sal,DoubleType,true), StructField(deptno,IntegerType,true))
步骤 3. 将字符串元组转换为行
val rowRDD = refinedRDD.map(attributes => Row(attributes._1, attributes._2, attributes._3, attributes._4, attributes._5 , attributes._6, attributes._7))
第 4 步。
val empDF = spark.createDataFrame(rowRDD, mySchema)
这也不起作用,并给出与类型相关的错误。为了解决这个问题,我将步骤 1 更改为
(fields(0).toInt,fields(1),fields(2),fields(3).toInt,fields(4),fields(5).toFloat,fields(6).toInt)
现在这是日期类型列的错误,我又遇到了主要问题。
用例 - 使用 textFile Api,在其上使用自定义架构 (StructType) 将其转换为数据框。
这可以使用案例类来完成,但在案例类中,我也会被困在我需要执行字段 (4).toDate 的地方(我知道我可以稍后在代码中将字符串转换为日期,但如果出现上述问题解决办法)
【问题讨论】:
-
为什么不简单地读取为 csv,使用 inferSchema 或提供自定义模式?
val df = spark.read .option("delimiter", "\\|") .option("header", true) .option("inferSchema", "true") .csv(path)应该足以读取数据帧。 -
@ShankarKoirala 因为该文件不是 csv,它是带有分隔符管道的 .dat 文件,我在步骤 2 中创建自定义模式,并在步骤 3 中将元组转换为行时出错使用该 rdd 行创建数据框。你知道一种将自定义模式附加到 rdd i 命令以创建数据框的方法吗?
标签: scala apache-spark