Spark常问面试题---项目总结

server/2024/12/4 16:47:04/

一、数据清洗,你都清洗什么?或者说 ETL 你是怎么做的?

我在这个项目主要清洗的式日志数据,日志数据传过来的json格式

去除掉无用的字段,过滤掉json格式不正确的脏数据

过滤清洗掉日志中缺少关键字段的数据(如缺少用户名,设备型号,等)

过滤清洗掉日志中不符合时间段的记录(由于app上日志上报有延迟等)

对用户的特殊信息进行脱敏,身份证,手机号等

将简单的的数据标准化(用户传过来的数据,经清洗后写入表格)

将重复的数据去重等(如session分割)

二、hive 和 spark 如何关联,关联过程中容易出现什么问题?

如何在DataGrip上使用hive的数据源编写Spark代码_datagrip配置spark-CSDN博客

如何关联:

启动hive的HiveMetaStore服务(hive-server-manager.sh start metastore)

设置spark的日志级别

启动spark的链接服务(10000端口hive在用,可以将spark的端口更改为10001)

遇到的问题:

hive中的数据库和sparksql中的数据库不是同一个,spark指向了本地的而不是集群的hdfs

链接之后,创建库表,上传数据后去集群的mysql中查看dbs中看这个库指向的是hdfs还是本地

需要修改hive的配置文件,然后复制到sparkconf然后分发集群重启就行

三、hive 如何处理 json 数据?

两个方法:

1、将数据视为无结构的string,将传入的json数据看作一条数据然后在hive建表上传

然后使用get_json_object函数

select get_json_object(line,'$.account') from test_json limit 10;

2、json格式进行映射(这需要jsonSerde的支持),创建表的时候加上ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe',然后就可读json数据,load就行

hdfs上的数据,导入表中一次后,直接删除,或者叫做移动,所以下一次再导入会说没有这个文件。

3、json_tuple() 可以一次提取多个字段。

select json_tuple('{"action_time":1682219447,"monitor_id":"0001","camera_id":"1","car":"豫A12345","speed":34.5,"road_id":"01","area_id":"20"}','camera_id','road_id','area_id','speed') as (cameraid,roadid,areaid,speed);

四、你的这个 spark 离线数仓的项目的项目架构图,请简单描述一下

数据经flum的抽取,将各个埋点的日志数据传入hive(进行处理sparksql处理)作为ods层,然后对ods层的数据进行清洗脱敏等然后当作tmp临时表,然后将tmp表进行合并生成dwd公共数据明细层,然后以dwd为基础,按天进行轻度汇总,粒度是一行信息代表的行为,例如一天下单的次数,以dws数据层为基础,按主题进行汇总,一个项目可以分为很多的主题,进行汇总,例如某个用户从注册开始到现在下单次数等,ads为各种统计表提供数据。

其中要对整个流程进行调度,监控,权限管理。

五、编写完成的 spark 程序,如何运行?

1、在本地模式运行

编写好的Python代码直接在本地运行

2、在集群环境中运行

编写完成的pyspark程序,上传到虚拟机,要把依赖的文件也上传上去,我这里上传的地址在/home/spark-shell中,然后将jsonsed的依赖jars包拉进去,然后sumit提交spark任务,传入参数,就能运行,在正常的情况下,要把每一py程序写成一个shell脚本,然后任务调度器每天定时调度shell脚本传入日期数据

spark-submit    \
--master yarn  \
--deploy-mode client \
--conf "spark.pyspark.driver.python=/opt/installs/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/opt/installs/anaconda3/bin/python3" \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1 \
--num-executors 2 \
--queue default  \
/home/spark-shell/AppLogWash.py $dt

六、spark 本地化运行,提示缺包怎么办?集群提示缺包怎么办?

spark本地化运行,提示缺包:

将所缺少的包导入到External libraries下的 site-packages\pyspark\jars下,重启服务

集群提示缺包 解决方案:

1、运行时,添加jar包依赖,需要使用如下方式:

--jars /opt/installs/hive/lib/hive-serde-3.1.2.jar,/opt/installs/hive/lib/hive-common-3.1.2.jar

2、将两个jar包,提交到hdfs上的spark的jars下:

hdfs dfs -put /opt/installs/hive/lib/hive-serde-3.1.2.jar /spark/jars

hdfs dfs -put /opt/installs/hive/lib/hive-common-3.1.2.jar /spark/jars

七、你这个项目中的 session 分割是什么?怎么做?为什么 要做这个呢?

分割的是用户在App的会话信息。因为APP的session往往持续时间比较长,不像浏览器那样,有固定的30分钟,所以对APP上的行为进行会话内的分析是不准确的 当一个行为发生时间相比较上一个行为的时间超过10分钟,则认为用户刚才将APP后台或者退出了,则从该行为开始属于一个新的会话。

怎么做?

先创建一张原始表,将分割前的数据导入进去。

创建一张表,存储session切割之后的结果。

创建一个类AppLogSessionSplit,通过sparksql完成session会话切割操作

每次开发,可以先使用hive 将sql编写正确,然后再在spark中粘贴。

为什么?

通过对用户的行为按照时间进行session会话的切割,可以对设备的行为按照会话级别粒度进行分析,例如一个用户在一次会话中从哪进入了产品,又从哪退出了产品,在一次会话中用户的停留时长,在一次会话中用户访问了多少个页面等


http://www.ppmy.cn/server/147325.html

相关文章

三十:在 Web 中什么样的响应才会被缓存?

Web 缓存是提升网站性能、减少服务器负载、降低延迟并提高用户体验的关键技术之一。为了确保缓存机制能够有效工作,开发者需要了解哪些响应会被缓存以及如何配置这些响应。本文将探讨 Web 中哪些响应会被缓存,以及缓存控制的基本原理。 1. 缓存概念简述 在 Web 中,缓存是将…

三维地形图计算软件(四)-用PYQT5+vtk画任意多面体示例

现已完成三维地形图三角网的三维显示和用多线程计算平基土石方功能,正在准备进入将用于计算出的全部三棱柱(锥)实体也能以三维方式显示出来,并可以选中三维实体和查看他们的属性,现将如何在已知几个点的情况下画出任意…

跟着官方文档快速入门RAGAS

官网: Ragas Ragas(Retrieval-Augmented Generation, RAG)是一个基于简单手写提示的评估框架,通过这些提示全自动地衡量答案的准确性、 相关性和上下文相关性。这种评估方法不需要访问人工注释的数据集或参考答案,使得评估过程更…

我谈冈萨雷斯对频域滤波的误解——快速卷积与频域滤波之间的关系

在Rafael Gonzalez和Richard Woods所著的《数字图像处理》中,Gonzalez对频域滤波是有误解的,在频域设计滤波器不是非得图像和滤波器的尺寸相同,不是非得在频域通过乘积实现。相反,FIR滤波器设计都是构造空域脉冲响应。一般的原则是…

el-table 纵向 横向 多级表头

<el-table :data"tableData" class"diaTable":span-method"handleSpanMethod"border:header-cell-style"{background:#292929,color:#fff}"><!-- 纵向表头 --><el-table-column label"纵向表头" width"…

【docker】docker compose多容器部署

Docker Compose 的详细讲解与实际应用 什么是 Docker Compose&#xff1f; Docker Compose 是一个工具&#xff0c;用于定义和运行多容器 Docker 应用。 通过一个 docker-compose.yml 文件&#xff0c;可以同时启动多个服务&#xff0c;简化多容器管理。 Docker Compose 的核心…

echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip

一.地图立体效果 方法1:两层地图叠加 实现原理:geo数组中放入两个地图对象,通过修改zlevel属性以及top,left,right,bottom形成视觉差 配置项参考如下代码: geo: [{zlevel: 2,top: 96,map: map,itemStyle: {color: #091A51ee,opacity: 1,borderWidth: 2,borderColor: #16BAFA…

如何管理Stream中的事件流

文章目录 1. 概念介绍2. 管理方法3. 示例代码我们在上一章回中介绍了事件流相关的内容,本章回中将介绍如何管理Stream事件流。闲话休提,言归正传,让我们一起Talk Flutter吧。 1. 概念介绍 我们简单回顾一下前面的知识:Stream把相关的事件组成了事件流,并且提供方法来监听…