0


任务二:数据清洗

   题目要求: 编写Scala工程代码,将ods库中相应表数据全量抽取到Hive的dwd库中对应表中。表中有涉及到timestamp类型的,均要求按照yyyy-MM-dd HH:mm:ss,不记录毫秒数,若原数据中只有年月日,则在时分秒的位置添加00:00:00,添加之后使其符合yyyy-MM-dd HH:mm:ss。

    将ods库中customer表数据抽取到dwd库中dim_customer的分区表,分区字段为etldate且值与ods库的相对应表该值相等,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填写“user1”, 、dwd_modify_time均填写操作时间,并进行数据类型转换。在hive cli中按照cust_key顺序排序,查询dim_customer前1条数据,将结果内容复制粘贴至对应报告中;

此题应该用spark-core或者sparksql都可以,感觉用sql会简单一些

一、先将数据从customer表抽取到dim_customer

    由于没有数据源,不清楚dim_customer的字段有哪些,所以就按照customer表的字段自行创建一个,数据也是我随便写吧

1.建表

spark.sql("create table dim_customer(id int,name string,age int) partitioned by (etldate string)")

这里也可以使用like,会更简单一些,但要确定两表的分区字段一致,否则会报错

2.导入数据

    在这里我用的动态导入,需要先关闭严格模式

scala> spark.sql("set hive.exec.dynamic.partition.mode=nonstrict;")

spark.sql("insert overwrite table dim_customer PARTITION (etldate) select * from customer")

3.查表

可见数据已经导入成功

二、添加字段

spark.sql("ALTER TABLE dept add columns(dwd_insert_user string)")

spark.sql("ALTER TABLE dept add columns(dwd_insert_time string)")

spark.sql("ALTER TABLE dept add columns(dwd_modify_user string)")

spark.sql("ALTER TABLE dept add columns(dwd_modify_time string)")

查表

我不知道hive如何在新增字段时设置默认值,所以此时新增的数据都为null,所以下一步要将null修改为我们需要的值

修改dwd_insert_user列

scala> spark.sql("insert overwrite table dim_customer partition(etldate) select id,name,age,nvl(dwd_insert_user,'user1') as dwd_insert_user,dwd_modify_user,dwd_insert_time,dwd_modify_time,etldate from dim_customer")

修改dwd_modify_user列

spark.sql("insert overwrite table dim_customer partition(etldate) select id,name,age,dwd_insert_user,nvl(dwd_modify_user,'user1') as dwd_modify_user,dwd_insert_time,dwd_modify_time,etldate from dim_customer")

修改dwd_modify_time列

spark.sql("insert overwrite table dim_customer partition(etldate) select id,name,age,dwd_insert_user,dwd_modify_user,dwd_insert_time,nvl(dwd_modify_time,'2022-08-13'),etldate from dim_customer")

修改dwd_insert_time列

spark.sql("insert overwrite table dim_customer partition(etldate) select id,name,age,dwd_insert_user,dwd_modify_user,nvl(dwd_insert_time,'2022-08-13'),dwd_modify_time,etldate from dim_customer")

三、将日期格式改为yyyy-MM-dd HH:mm:ss

由于不知道原数据是什么样,这里只改dwd_insert_time和dwd_modify_time两列

spark.sql("insert overwrite table dim_customer partition(etldate) select id,name,age,dwd_insert_user,dwd_modify_user,date_format(dwd_insert_time,'yyyy/MM/dd HH:mm:ss') as dwd_insert_time ,date_format(dwd_modify_time,'yyyy/MM/dd HH:mm:ss') as dwd_modify_timeetldate ,etldate from dim_customer") ;

注意:date_format函数如果第一个参数是字符串,连接符只能是

-

,别的识别不了

四、查询

题目让使用cust_key排序,在这里我用age排序

select * from dim_customer order by age limit 1;

我感觉我写的还是有一些麻烦,如果有简单一点的希望大佬们能指点一下

标签: java 开发语言 spark

本文转载自: https://blog.csdn.net/guo_0423/article/details/126312846
版权归原作者 guo_0423 所有, 如有侵权,请联系我们删除。

“任务二:数据清洗”的评论:

还没有评论