任务二:数据清洗

       题目要求: 编写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;

 

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值