如何高效的做到全栈数据工程师系列
The following article is from 憋七工作室 Author 憋七
导读:如何高效的做到全栈数据工程师,本文从面试的视角展开主要分为以下篇章:
数仓动力篇
Hive函数篇
Hive优化篇
数仓模型篇
数仓面试篇
作者: 憋七
编辑: 紫霞仙子
正文
一、动力篇
对于公司来说,我们这类人就是一个辛勤的小蜜蜂,公司就是我们的家,每天都在为蜂巢不断扩大献出自己的一份力。
二、Hive函数篇
row_number()over(partition by order by ):从1开始按照partition by 字段进行排序 rank()over(partition by order by ):从1开始按照partition by 字段排序,遇到并列取相同数值,后面的跳跃计数 dense_rank()over(partition by order by ):从1开始按照partition by 字段排序,遇到并列取相同数值,后面的顺序计数 sum()over(partition by order by #rows between unbounded preceding and current row):根据某列进行汇总,常用在算累计销售额或者累计订单量,#之后的rows between unbounded preceding and current row代表累计增加之前的行,可加可不加 lead(col,n,default)over(partition by order by ):col字段向上n行,default为向上为NULL时的默认值 lag(col,n,default)over(partition by order by):col字段向下n行,default为向下为NULL时的默认值 first_value(col)over(partition by order by):分组排序后,组内的第一个col的值 last_value(col)over(partition by order by):分组排序后,组内的最后一个col的值
UDF(User-Defined-Function)一进一出
UDAF聚合函数(User-Defined Aggregation Funcation)多进一出,如count(),sum()
UDTF制表函数(User-Defined Table-Generating Functions)一进多出,如 lateral view explore()
order by:全局排序,缺点是会把分组的数据放到一个Reduce中
sort by:局部排序,把每个Reduce中的数据进行排序,Reduce数量在2个以上有用,缺点是输出排序结果会有重叠
distribute by:提前排序,在Map端先进行排序,再结合sort by,把排好序的数据放到同一个Reduce中再进行局部排序,如同group by,放在sort by之前,例如:select * from A group by col distribute by time sort by id
cluster by:如果distribute by和sort by 的字段相同,就可以用cluster by代替他们的组合用法,缺点是只能升序,不能asc和desc,而且只能保证一个分区内的排序,例如:select * from A cluster by id (同select * from A distribute by id sort by id)
concat_ws(',',collect_set(col)):collect_list 不去重,collect_set 去重。col的数据类型要求是string
union all/union
lateral view explode(split(col,',')) 虚拟表别名 as 列别名:用法很特殊,放在from tablename和where中间,原理是lateral view(侧视图)与UDTF函数将一行拆分为多行,创建一个虚拟表,再与原表进行笛卡尔积关联。explode()是专门处理map/array结构数据的,解析json数据要配合get_json_object()
case when...end
group by
distinct
row_number()
三、Hive优化篇
在map端做合并:hive.merge.mapfiles=true(默认值为true) 在reduce端做合并:hive.merge.mapredfiles=false(默认值为false) 合并文件大小:hive.merge.size.per.task=256*1000*1000(默认值为256000000) 减少Textfile文件格式存储 使用参数减少Reduce数量:set mapred.reduce.tasks=n hadoop archive命令把小文件进行归档
四、数仓模型篇
sqoop:工具本身没有可问的,但会问到mysql集群的架构是怎么设计的,使用sqoop会遇到的问题
binlog:kafka落地到hdfs再做合并
Inmon
2.Kimball
退化维度:把维度信息放到事实表中,一般都是事务的编号,如订单编号、发票编号等。这类编号需要保存到事实表中,但是不需要对应的维度表,所以称为退化维度。
Kimball中三个重要的概念:一致性维度、一致性事实、总线架构。这里的总线架构的概念需要明白,有些面试官会用这些专业名词考察你的理论知识
总线架构:就是多维体系架构,还要用到一致性维度概念,可以理解成不同的业务线使用相同的数据维度,就叫总线架构。引入一个网图更好理解:图中四个业务过程用相同的日期,其他指标有相同的也有不同的。
五、面试题篇
离线数仓分层情况、建模理论以及维度表的概念 实时数仓是否使用过,如何选型,遇到的问题,业务场景 数据结构是否了解 Hadoop原理、或分布式原理(问这个问题的面试官竟然不知道CDH是什么) MapReduce原理 HiveSql优化 Hive函数的使用,排序的区别,行转列,列转行 Mysql引擎以及索引的理解 A/B Test平台、用户画像,设计方法 算法题 Python语法的理解 后台开发,工程开发 当场给业务场景进行设计分层 元数据系统、数据质量、血缘关系,怎么做的 打点数据统计、数据埋点管理 Spark原理以及在使用中的问题 项目管理问题 外部产品原理(kylin、Tidb、Doris、Airflow等等)
最后,对于面试经验,再奉上两位一线大厂大佬的面经:
本篇只是基于个人情况和见闻,我这种普通人的经验可能不适用于大牛和大佬。欢迎入群交流,戳:快来加入数据交流群吧
如有不周,还望指点。
胡言呓语,一笑便罢。
如果您喜欢本文,欢迎点击右上角,把文章分享到朋友圈~~
520当当网全场5折,每满100减50,满200-100,优惠码、折上折减30,170=400!!
Maxwell和Canal的选型和规划
菜鸟实时数仓技术架构演进
基于Binlog实时同步数据仓库问题总结
欢迎加入中台|数仓技术交流群。戳:数据交流群!
进群方式:请加微信(微信号:iom1128),回复:数据,通过审核会自动拉你进群。
(备注:行业-职位-城市)
01. 后台回复「经典」,即可领取大数据数仓经典书籍。
02. 后台回复「中台」,即可领取大厂中台架构高清ppt。
03. 后台回复「加群」,或添加小助微信ID:iom1128 拉您入群(大数据|数仓|分析|Flink|资源)或领取资料。
Q: 关于数据仓库,你还想了解什么?
欢迎大家扫描下方二维码订阅「数据仓库与Python大数据」内容并推荐给更多数据方向的朋友,希望有更多机会和大家交流。
更多精彩,请戳"阅读原文"到"数仓之路"查看
!关注不迷路~ 各种福利、资源定期分享!