数仓项目常见问题解答
一、数据清洗,你都清洗什么?或者说 ETL 你是怎么做的?
1.去除json格式不正确的(脏数据)
2.去除json中没用的废弃字段
3.过滤日志中缺少的关键字段(比如各种id)的记录
4.过滤掉日志中不符合时间段的记录(由于app上报有延迟,有数据延迟到达)
5.标准化,表名和字段名符合一般的规则
6.默认值填充,比如都性别字段男填充为0女填充为1
二、hive 和 spark 如何关联,关联过程中容易出现什么问题?
在spark-on-yarn环境下关联,启动metastore和threat服务,关联过程中可能会出现在spark中创建好的表在hdfs上查找不到,在本地被查到,需要修改hive里面的hive-sie.xml和spark中的hive-site.xml文件,缺包问题jar目录下缺少spark版本对应的hive-serde的jar包和hive-common的jar包在读取json数据时会失败。
三、hive 如何处理 json 数据?
利用jsonserde处理,导入一个三方的jar包到hive的jar目录下,然后再导入一个hive-common对应服务器spark对应版本的jar包;或者加载本地自带的反序列化jar包,然后建表时指定jar包即可直接读取json数据。
四、你的这个 spark 离线数仓的项目的项目架构图,请简单描述一下
五、编写完成的 spark 程序,如何运行?
利用spark-sumbit命令提交到spark-yarn模型下的spark集群上运行。
六、spark 本地化运行,提示缺包怎么办?集群提示缺包怎么办?
本地确保需要在所在pyspark环境下的jar目录导入hive-serde的jar包和hive-common的jar包,集群提升缺包需要在hdfs上的spark目录下的jar目录下导入hive-serde和hive-common的jar包。
七、你这个项目中的 session 分割是什么?怎么做?为什么 要做这个呢?
根据同一个设备做两件事情的时间间隔来分割的。如果同一个设备在做两件事的间隔大于10分钟则给它们一个1做为标签算作两个会话,然后使用sum对该设备的标签数求和,这样可以防止时间过长做的两个事件只被统计一次,可以提高统计会话窗口的精准率。
八、hive 表的数据存储格式,以及各个格式之间的优劣(区别)
hive的存储格式分为两大类:一类是纯文本,一类是二进制文件存储。
Hive支持的主要存储数据的格式有:TEXTFILE,SEQUENCEFILE,ORC,PARQUET
第一类:纯文本文件存储
textfile:纯文本文件存储格式,不压缩,也是Hive的默认存储格式,磁盘开销大,数据解析开销大。
第二类:二进制文件存储
- sequencefile:
会压缩,不能使用load方式加载数据
- parquet:
会压缩,不能使用load方式加载数据
- rcfile:
会压缩,不能load。查询性能高,写操作慢,所需内存大,计算量大。此格式为行列混合存储,hive在该格式下,会尽量将附近的行和列的块存储到一起。
- orcfile:rcfile的升级版。
九、如何创建分区表,如何创建分桶表,如何创建外部表
--分区表:
create table part1(
id int,
name string,
age int
)partitioned by (dt string)
row format delimited
fields terminated by ','
lines terminated by '\n';
--分桶表:
--创建一个4个桶的分桶表
create tavle bucket1(id int,name string)
clustered by (id)
into 4 buckets
row format delimited fields terminated by ' ';
--外部表:
create external table test1(id int ,name string)
row format delimited
fields terminated by ','
location '/publicData'
--这个location 是本地的意思还是hdfs的路径呢?答案是必须在hdfs上。
--内部表和外部表的转换:
alter table test1 set tblproperties('EXTERNAL'='flase')--转换为内部表
alter table test1 set tblproperties('EXTERNAL'='TRUE')--转换为外部表
--TRUE一定要大写
十、hive 中有哪些数据类型。
- 基本数据类型
数值类型
TINYINT:1字节整数,范围 -128 到 127。
SMALLINT:2字节整数,范围 -32,768 到 32,767。
INT:4字节整数,范围 -2,147,483,648 到 2,147,483,647。
BIGINT:8字节整数,范围 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
FLOAT:4字节单精度浮点数。
DOUBLE:8字节双精度浮点数。
DECIMAL:精确的高精度数字,可以指定小数点后位数和整数位数。
字符类型
STRING:变长字符类型。
CHAR(n):定长字符类型,n表示字符数。
VARCHAR(n):变长字符类型,n表示最大字符数。
布尔类型
BOOLEAN:表示 TRUE 或 FALSE。
日期和时间类型
DATE:表示日期,格式为 yyyy-MM-dd。
TIMESTAMP:表示日期和时间,精确到毫秒,格式为 yyyy-MM-dd HH:mm:ss。
INTERVAL:表示时间间隔,用于计算日期或时间的增量。
2. 复杂数据类型
集合类型
ARRAY:元素类型为 T 的数组。 MAP<K, V>:键为 K 类型,值为 V 类型的映射。 STRUCT:包含不同类型元素的复合数据结构,类似于记录。 元组(Tuple)类型
TUPLE:多个元素的有序集合,类似于数组。
UNIONTYPE
UNIONTYPE:表示可以为多种类型中的任何一个。常用于表示可能有多个类型的字段。