2024秋招真实面经分享~~,文档已编辑成册

补充:Spark的内存,OOM和哪些参数有关

Spark中的内存溢出,无非两点:

  1、Driver内存不够:

    读取内存数据太大,

    数据需要回传

  2、Exectuor内存不够:

    map类操作产生大量的数据,包括map/flatmap/filter

    shuffle后产生数据倾斜

补充:在数仓工作中,产品和业务沟通不够导致的指标不一致,可能是有哪些问题导致的,应该怎么去做

包括如下几个方面:

1、需求理解差异

2、缺乏标准化

3、数据口径不统一

4、沟通不畅

5、文档缺失或不完善

解决方法:加强沟通需求/建立数据标准化体系/统一数据口径/加强跨团队沟通与合作/完善文档管理

补充:RDBMS和NOSQL的区别

RDBMS:高度组织化结构化数据,结构化查询语言,数据和关系都存储在单独的表中,数据操作语言,数据定义语言,严格的一致性,基础事务

NOSQL:代表着不仅仅是SQL,没有申明性查询语言,没有预定的模式,kv存储,文档存储,图形化数据库,最终一致性,非结构化和不可阈值的数据

补充:Hive的存储格式用的什么

Hive数据存储常用的格式如下:

  行式存储:文本格式textfile,二进制序列化SequenceFile

  列式存储:行列式文本RCFile,ORCFile,Parquet

补充:Hive存储格式中ORC优势在哪里

1)ORC文件是自描述的,元数据使用Protocol Buffers序列化,文件中的数据尽可能的压缩降低存储空间的消耗

2)以二进制文件进行存储,不可使直接读取

3)ORC会尽可能合并多个离散的区间尽可能减少IO次数

4)ORC中使用了更加精确的索引信息

5)加入布隆过滤器,进一步提升谓词下推的效率

补充:mysql中的聚簇索引

聚簇索引:将数据存储和索引放到一起,找到了索引也就找到了数据;一般情况下主键会默认创建聚簇索引,一张表只允许创建一个聚簇索引

非聚簇索引:将数据存储和索引结构分开,索引结构的叶子节点指向了数据的对应行;MyISAM通过key——buffer把索引先缓存到内存中,当需要访问数据时候,在内存中直接查找索引,然后通过索引找到磁盘相应的数据,

注意:聚簇索引一张表只能有一个,非聚簇索引可以有多个

InnoDB中,在聚集索引上创建的索引将辅助索引

辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值

对于聚簇索引而言,按照每张表的主键构造一棵B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚簇索引的叶子节点称为数据页

在聚集索引上创建的索引叫做辅助索引,辅助索引访问数据总是需要二次查找,第一次找到主键,第二次找到行数据,

补充:为什么主键通常建议使用自增ID

聚簇索引的数据的物理存放顺序是索引顺序一致的,只要索引是相邻的,那么对应的数据一定也是相邻的存储在物理磁盘上的;MyISAM的主索引并非聚簇索引,所以它的物理地址必然是凌乱的

补充:什么情况下会发生死锁?解决死锁的策略有哪些?

发生死锁的必要条件:资源互斥利用/多个进程保持一定的资源,但又请求了新的资源/资源不可被剥夺/多个进程循环等待

补充:如何处理数据中的缺失值?请举例说明至少两种方法。

1)删除

  直接去除含有缺失值的记录,简单粗暴,适用于数据量较大但是缺失值较少的情况,去掉后对总体影响不大

2)常量填充

  全局常量填充:可以用0,均值、中位数、众数等填充

  3)插值填充

    采用插入值进行填充,可以取缺省值的前后均值填充

补充:数据清洗的步骤

1)缺失值清洗

  确定缺失值范围

  去除不需要的字段

  填充缺失值内容

  2)格式内容清洗

  事件/日期/数值/全半角等显示格式不一致

  内容中有不该存在的字符

  内容与该字段应有内容不符

  3)逻辑错误清洗

  去重

  去除不合理值

  修正矛盾值

补充:数据采集零点漂移问题

何为数据漂移:接入层ODS表同一个业务日期数据中包含前一天或者后一天凌晨的业务数据

为什么会发生数据漂移:由于网络问题延迟或者系统压力,导致数据漂移

处理数据漂移的的方案:1)在ods层每个时间分区中向前,向后多一些冗余数据,保证数据只会多不会少;2)通过多个时间戳字段限制时间来获取对应相对准确的数据;

补充:数据域和主题域的区分

数据域:数据域是指面向业务分析,将业务过程或者维度进行抽象的集合;在划分数据域时候,既要涵盖当前所有业务需求,又能让新业务在进入时候可以被包含进已有的数据域或扩展新的数据域

主题域:主题域是将数据装载到数据仓库中的第一步,

区别:主题域是针对数据集市提出来的概念,数据集市是面向主题,从业务驱动进行分析场景的建设

  数据域是基于CDM层提出来的,是数据驱动业务,是对数据分分类

可以在DWD层按照数据域进行分类,DWS层按照主题域划分,ADS层可以按照业务场景进行划分

补充:DIM层维度表的设计原则

公共维度层基于维度建模理论,建立整个企业的一致性维度,主要由维表构成

补充:count(1)和count(*)

count(1):都为统计所有记录数,包括null

count(字段):统计字段列数,不包括null,若null为主键,则效率最高

补充:Spark的client模式和集群模式

针对Spark集群部署的方式,主要区别是driver进程放在哪里

对于client模式:master和worker节点是在同一个网段中,并在driver在master节点上

对于cluster模式:driver在worker集群中的某个节点中,而非master节点,driver占据worker的资源

补充:mysql中的存储过程

简而言之,存储过程就是数据库sql语言层面代码封装与重用

简化对变动的管理,如果表明/列名或或者业务逻辑有变化,只需要更改存储过程的代码

存储过程被创建之后,就存储在数据库中,

有助于减少应用程序和数据库服务器之间的流量,不用再发送冗长的sql语句

补充:Flink中的数据倾斜是什么?

补充:企业数字化转型

利用云计算/人工智能/物联网等技术,帮助我们的企业在连接效率/数据应用/智能算法等方面实现企业最优决策的高效输出,帮助企业提升经营效率和用户体验,实现企业未来的可持续发展

补充:列举几种常见的数据抽取、转换和加载(ETL)工具,并简述其特点。

sqoop/datax/kettle/canal/streamsets

1、sqoop

开源在Hadoop和关系型数据库服务器之间传输数据的工具,可以进行关系型数据库与HDFS相互转换,

其本质是转化为MR程序

2、datax

阿里开源离线数据同步工具,异构数据源同步

3、kettle

4、canal

基于数据库增量日志解析,提供增量数据实时订阅和消费

补充:如何处理数据中的缺失值?请举例说明至少两种方法。

  1、直接删除缺失值,

  此方法适用于缺失值较少或者对数据分析结果影响较小的情况

  2、填充缺失值

  可以使用均值/中位数/众数等方法进行填充

补充:在大数据环境下,如何保证数据的一致性和准确性?

事务:使用数据库事务机制确保数据操作的原子性/一致性/隔离性/持久性;通过锁机制来避免并发操作导致的冲突

分布式锁:当多个服务或节点需要同时访问共享资源时候,使用分布式锁来协调这些访问

乐观锁和悲观锁:

数据一致性协议:使用一致性协议,确保多个副本之间的数据同步

消息队列:通过消息队列实现数据的异常处理,确保数据按照正确的顺序被处理;使用消息队列的持久化,重试和顺序保证

数据校验与重试:在数据传输和处理过程中加入校验机制,确保数据的完整性和准确性;对于可能失败的操作,进行重试,确保数据的一致性

监控与告警:实时监控数据一致性相关的指标;设置告警阈值,及时发现并处理可能导致数据不一致的问题

补充:如何优化 SQL 查询以提高性能?

1、首先应该考虑where以及order by涉及的列建立索引

2、尽量避免在where子句中对字段进行null值判断

3、尽量避免在where子句中使用!=或者<>操作符

4、慎用in和not in,用exists代替in,对于连续的数值,可用between and代替

5、在where子句中使用参数,也会导致全表扫面

6、不带任何条件的count会引起全表扫描

7、任何地方都不要使用select * from table,用具体列字段代替

8、update,如果只是更改1,2个字段,不要update全部字段,否则频繁调用会引起明显的性能消耗

9、对于多张大数据量的表进行join,先分页,在join,否则逻辑读会很高,性能差

10、一张表的索引不超过6个

11、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,会降低查询和连接的性能,增加存储开销(引擎在处理查询和连接时候会逐个比较字符串中每一个字符,但对于数值而言只需要比较一次)

12、尽可能使用varchar/nvarchar代替char/nchar,变长字段存储空间小,可以节省存储空间

13、在新建临时表时候,若一次性插入数据量很大,那么可以使用insert into代替create table,避免造成大量的loh,提高速度,如果数据量不大,则先create,再insert

14、如果使用到了临时表,在存储过程的最后务必将所有的临时表删除,在truncate,再drop,避免系统表长时间锁定

15、尽量避免大事务操作,提高系统并发能力

16、尽量避免向客户端返回大数据量

索引

17、定义主键的数据列一定要建立索引

18、定义有外键的数据列一定要建立索引

19、对于经常查询的数据列最好建立索引

20、对于需要在指定范围内的快速或频繁查询的数据列,建立索引

21、经常用在where中的列建立索引

22、对于查询涉及较少的列,重复值较多的列不要建立索引

23、对于定义为text/image/bit类型的数据不要建立索引

24、对于经常存取的列建立索引

25、对于一个存在大量更新操作的表,所建索引的数据一般不要超过三个

26、尽量地扩展索引,不要建立新索引

27、最左前缀匹配原则(mysql会一直向右匹配直到范围查询(>< between like)就停止匹配),在检索数据时从联合索引的最左边开始匹配

补充:解释一下数据清洗的主要流程和步骤。

补充:数据库中索引底层原理

系统从磁盘读取数据到内存时候是以磁盘块为基本单位的,位于同一个磁盘块中的数据会被一次性读出来,而不是需要什么取什么

B-Tree:一颗m阶得B-Tree有如下特性:

1、每个结点最多有m个子结点

2、除了根结点和叶子结点之外,每个结点最少有m/2个子结点

3、如果根结点不是叶子结点,那根节点至少包含两个子结点

4、所有得叶子结点都位于同一层

5、每个结点都包含k个关键字,m/2 小于等于k小于m

6、每个结点中得元素从小到大排列

7、每个元素得左结点的值,都小于或等于该元素,右结点的值都大于等于该元素

B+Tree:

1、所有的非叶子结点只存储关键信息

2、所有具体数据都存在叶子结点中

3、所有的叶子结点中包含了全部元素的信息

4、所有叶子结点之间都有一个链指针

位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么;每一个存储块称为一页

补充:B-Tree和B+Tree的选择

1、B-Tree中的非叶子结点也保存具体数据,而B+Tree所有的数据都在叶子结点中,每次查找数据都得到叶子结点,对于相同高度而言,前者的效率高

2、B+Tree叶子结点之间右指针连接,查询速度快,B-Tree还需要遍历各个结点搜索

3、B-Tree的每个结点,都存储主键+实际数据,而B+Tree非叶子结点只存储关键信息,同一页能存储的B-Tree的数据会比B+Tree存储的更少;同样数据量的数据,B-Tree的深度会更大,增大查询时候的磁盘IO

补充:mysql中索引的分类

按数据结构分:B+Tree索引,Hash索引,Full-text索引

按物理存储分:聚簇索引(主键索引),二级索引(辅助索引)

主键索引的B+树的叶子结点存放的是实际数据,所有完整的用户记录都存放在主键索引的B+树的叶子结点里

二级索引的B+Tree的叶子节点存放的主键值,而不是实际数据

若在查询时候使用了二级索引,如果查询的数据能在二级索引里查询的到,就不需要回表,这个过程就是覆盖索引

若查询的数据不在二级索引里,就会先检索二级索引,找到对应的叶子节点,获取到主键值后,然后再检索主键索引,就能查询到数据,这个过程就是回表

InnoDB存储引擎根据类型不同,分为聚簇引擎和二级索引,聚簇索引的叶子节点存放的是实际数据,所有完整的用户数据都存放在聚簇索引的叶子节点中,而二级索引的叶子节点存放的是主键值,而不是实际数据

按字段特征分:主键索引,唯一索引,普通索引,前缀索引

主键索引:就是在主键字段上的索引,通常是在创建表的时候就一起创建,一张表最多只有一个主键索引,索引列不允许由空值;关键词——primary key

唯一索引:建立在unique key字段上的索引,一张表可以有多个唯一索引,索引列的值必须唯一,但允许有空值

普通索引:就是建立在普通字段上的索引,既不要求字段为主键,也不要求字段为unique

前缀索引:是指对字符类型字段的前几个字符建立的索引,而不是在整个字段上建立的索引,前缀索引可以建立在字段类型为 char、 varchar、binary、varbinary 的列上。

按字段个数分:单列索引,联合索引

建立在单例上的称为单列索引,建立在多列上的索引称为联合索引

使用联合索引时候,存在最左匹配原则,按照最左有限的方式进行索引的匹配,先按照第一个字段进行排列,第一个字段相同的情况,再按后一个字段进行排列

在创建表的时候,InnoDB引擎会根据不同的场景选择不同的列作为索引:

  如果有主键,默认会使用主键作为聚簇索引的索引键

  如果没有主键,就选择第一个不包含null值得唯一列作为聚簇索引得索引键

  在上面两个都没有的情况下,InnoDB将自动生成一个隐式自增ID列作为聚簇索引的索引键

补充:什么时候需要创建索引,什么时候不需要创建索引

索引的好处就是提高查询效率,但同时也存在着缺点,占用物理空间,创建和维护索引需要时间,会降低表的增删改的效率

1)针对数据量较大,且查询比较频繁的表建立索引

2)针对常作为查询条件where/排序order by/分组group by操作的字段建立索引

3)尽量选择区分度较高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高

4)如果是字符串类型的字段,字段的长度较长,可以针对字段的特点,建立前缀索引

5)尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高效率

6)要控制联合索引的数量,索引越多,维护索引的代价也越大

7)如果索引列不能存储null值,建表时候使用not null

什么时候用:

1)字段有唯一性限制

2)经常用于where语句

3)经常用于group by 和order by字段

什么时候不需要创建索引:

1)where/group by/order by里用不到的字段不需要创建索引

2)某一个字段中有大量重复值数据,不需要创建字段

3)表数据太少,不需要创建索引

4)对于经常维护更新的字段,不需要创建索引;索引字段频繁修改,就需要频繁重建索引,会影响数据库性能

补充:InnoDB怎么存储数据的

InnoDB和MyISAM都支持B+索引,但是他们实现的方式不太一样

InnoDB存储引擎:B+树索引的叶子节点保存数据本身

MyISAM存储引擎:B+树索引的叶子节点报数数据的物理地址

记录是按照行来存储的,但数据库读取数据并不以行为单位,InnoDB本身是以页为单位来进行读写的,当需要读取一条记录的时候,实际读取出来的是该条记录所在的页的所有记录,将其整体读入内存;

InnoDB数据页默认大小是16kb,意味着数据库每次读写都是以16kb为单位的,最少一次读取16kb

一个数据页包含如下结构:

暂时无法在飞书文档外展示此内容

文件头中有两个指针,分别指向上一个数据页和下一个数据页,连接起来的页相当于一个双向的链表

补充:索引失效有哪些?

  1)对索引使用左或者左右模糊匹配的时候,索引会失效

  类比:where name like '%李%',where name like '李%'

2)如果查询条件中对索引字段使用函数,就会导致索引失效

  因为索引保存的是索引字段的原始值,而不是经过函数计算过后的值,自然就无法走索引

3)对索引进行表达式计算

  原因和函数失效道理一样,索引保存的是字段的原始值,而不是处理过后的值

4)对索引进行隐式类型转换

  5)联合索引非最左匹配

  多个普通字段组合在一起创建的索引就叫做联合索引,联合索引(a,b,c)和( b,c,a)在使用时候会有区别

6)where子句中的or

  如果在or前的条件是索引列,而在or后面的条件列不是索引列,那么涉及到的索引都会失效。

  7)字符串没有加引号的情况使用索引,索引将会失效;

  8)若mysql评估,全表扫描比索引查找快,则使用全表索引

补充:count性能的差异

1)count()

  count()是一个聚合函数,作用是统计符合查询条件的记录中,函数指定的参数不为null的记录有多少

补充:事务

  1.事务的特性

  ACID(原子性/一致性/隔离性/持久性)

  原子性:一个事务要么全部完成,要么全部不完成,若在中间发生错误,则会被回滚到之前的状态

  一致性:事务操作前后,数据满足完整性约束,数据库保持一致性

  隔离性:允许多个事务同时对数据库进行读写和操作,防止交叉事务执行导致数据不一致

  持久性:事务处理结束后,对数据的修改是永久的

持久性通过redo log来保证

原子性通过undo log来保证

隔离性通过MVCC或锁的机制来保证

一致性通过持久性+原子性+隔离性保证

2.并发事务引发的问题

脏读:一个事务读到了另一个事务未提交时修改过的数据,就发生了脏读

不可重复读:在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就发生了不可重复 读

幻读:在一个事务内多次查询某个符合查询条件的记录数量,如果出现前后两次查询结果不一致,说明出现了幻读

3.事务的隔离级别

读未提交RU:一个事务还没提交时候,它做的变更就能被其他事务看到 (不能解决上述三个问题)读提交RC:指一个事务提交之后,它做的变更才能被其他事务看到 (解决脏读问题)

可重复读RR:一个事务在执行过程中看到的数据,一直跟这个事务启动时候看到的数据是一致的(Mysql默认的隔离级别)(解决脏读和不可重复读)

串行化Ser:会对记录加上读写锁(解决所有问题)

一般不建议把隔离级别设置为串行化,会导致数据库性能很差

补充:Mysql锁

1)全局锁

Flush tables with read lock;整个数据库处于可读的情况

全局表的应用场景:通常用于数据库备份时候

2)表锁

包括了表锁/元数据锁/意向锁/auto-inc锁

表锁:表锁的颗粒度太大,会影响并发性能,innodb实现了颗粒度更细的行级锁

元数据锁MDL:当我们对数据库表进行操作的时候,会自动给这个表加上MDL(MDL是为了保证当用户执行CRUD时候,防止其他线程对这个表结构做了变更,并且MDL是在事务提交结束之后才会被释放,在事务执行期间,MDL是一直会有的)

3)行级锁

innodb支持行级锁,myisam不支持行级锁

补充:处理缺失值的方法

1)均值填充

2)高维映射

  将属性映射到高维空间,采用热独编码技术,将包含K个离散取值范围的属性值扩展为K+1个属性值,若该属性值缺失,则扩展后的第K+1个属性值为1;优点是保留所有原有信息,缺点是计算量提升;

补充:某一支付类app会员支付金额上涨了,分析为什么?

增长原因

  1)用户基数增加:新用户的加入所带来的自然增长;推广活动引起更多用户注册使用会员服务

  2)会员活跃度提升:平台推出激励会员的活动,导致会员活跃度和支付频次高

  3)消费场景扩展:和更多的商家建立了合作,增加了会员的支付功能的场景

  4)促销活动:大规模的促销活动或者优惠券

  5)季节性变化:某些时间段的用户消费行为会发生变化,导致支付金额上涨

  6)宏观经济环境:收入增加/经济复苏

补充:说说你对用户画像的理解。并且分析怎么利用用户画像提高利润额。

用户画像是针对用户数据的系统化收集和分析,创建的虚拟用户模型,详细描述用户的特征/行为/需求和偏好,帮助企业也指定更加精准的市场营销/产品开发和运营策略

1)精准营销

基于用户画像,向用户推荐他们可能感兴趣的产品或者服务,提升转化率和客单价;通过精准投放广告,将广告显示给潜在的高价值用户

2)优化产品和服务

根据用户画像中反映的需求和偏好,开发符合用户期望的新产品或改进现有的产品

补充:mysql数据库的文件存放在哪?

当我们新建一张表的时候,会在/var/lib/mysql/ 这个目录下新创建一个以表名命名的文件夹,当新建一张表的时候,会生成三个文件:.opt/.frm/.ibd,其中,.opt文件用来存储当前数据库的默认字符集和字符校验规则;.frm用来存储当前表的元数据信息;.ibd用来存储表的具体数据;

补充:表空间的结构是怎么样的

表空间-->段-->区-->页

行:数据库表中所有的数据都是按照行记录进行存放的

页:是数据库读写数据的最小单位,默认每个页的大小为16kb,读取时候,也会至少读取16kb的数据到内存中

区:数据量大的时候,并不是按照页为单位进行分配的,而是按照区为单位分配,每个区的大小为1Mb,连续的64个区会被划分成一个区

段:段一般划分为数据段和索引段,索引段存放B+树的非叶子节点的区的集合;数据段存放B+树的叶子节点的区的集合;回滚段:存放的是回滚数据的区的集合

补充:InnoDB行格式?

提供四种:

  Redundant(抛弃) :非紧凑行格式

  compact:紧凑行格式,一个数据页中可以存放更多的行记录

  dynamic和compressed:紧凑行格式,5.7后默认格式

变长字段长度列表

    在存储数据的时候,也要把数据占用的大小存起来,存到「变长字段长度列表」里面

    当数据表没有变长字段的时候,全是int类型字段的时候,表里的行格式就不会有变长字段长度列表了

    变长字段长度列表中的信息要逆序存放,可以使得位置靠前的记录的真实数据和数据对应的字段长度信息可以同时再一个cpu chche line中,提高命中率

NULL值列表

    null值全部存到真实数据中,会浪费很多空间,如果存在允许null值得列,则每个列对应一个二进制位,逆序排列,二进制位的值为1时候,代表该值为null,二进制为0时候,不为null

    当字段设置为not null的时候,表格式中就不会有null值列表;当一条记录有9个字段都是null的时候,会创建两字节的null值列表

记录头信息

    delete_mask:标识该条数据是否被删除,在我们执行删除的时候,并不会真正删除数据,而是会标记是否删除

记录的真实数据:

    row_id:如果建表时候指定了主键或者唯一约束列,那么就没有row_id字段了

    trx_id:事务id,标识这个数据是由哪个事务生成的

    roll_pointer

补充:varchar(n)的n最大取值是多少

  除了text/blobs大对象类型之外,其他所有列所占用的字节长度加起来不能超过65535字节,是一行的总长度限制

  varchar(n)中n代表的是最多存储的字符数量,并不是字节大小;还要看数据库表的字符集是什么

如果有多个字段的情况,要保证所有字段的长度+变长字段字节数列表所占用的字节数+null值列表所占用的字节数<=65535

补充:行溢出后,mysql是怎么处理的

一个页的大小一般是16kb,也就是16*2024=16384字节,一个varchar(n)最多可以存储65532字节,一个页存不下所有数据,就会发生数据溢出,多的数据就会存到另外的溢出页中去,然后真实数据处用20字节指向溢出页的地址,就可以找到剩余数据页

补充:哈希索引的特点

hash索引只能用于对等比较,不支持范围查询

无法利用索引完成排序操作

查询效率高,通常只需要一次检索就可以了(没有出现哈希碰撞),效率通常高于B+Tree

补充:最左前缀法则

如果有联合索引,要遵守最左前缀法则,最左前缀法则是指查询从索引的最左列开始,并且不跳过索引中的列,如果跳过了某一列,索引将部分失效(后面的字段索引失效)

补充:mysql中的回表

当索引中包含了select中的字段时候,就不需要回表;反之,二级索引定位到聚簇索引中,然后根据聚簇索引查找需要返回的值

补充:前缀索引

将varchar/text类型的字符串前缀截取出来建立索引,这样可以大大节约索引空间,提高索引查询效率

补充:表锁

表共享读锁:所有的客户端只能读取,但不能删除更新和新增

表独占写锁:写锁不仅会阻塞其他客户端的读,又会阻塞其他客户端的写

元数据锁(MDL锁):当对一张表进行增删改查的时候,加MDL读锁,当对表结构进行变更操作的时候,加MDL写锁

补充:union和union all

1)通过union连接的sql他们分别单独取出的列数必须相同

2)不要求合并的表列名称相同,以第一个sql表列名为准

3)使用union时候,完全相等的行,会被合并,但耗时大,通常采用union all进行合并

#九月投秋招是不是太晚了?##你的秋招进行到哪一步了##你的秋招进展怎么样了##你觉得今年秋招难吗##找不到实习会影响秋招吗#
【猜你想看】大数据面经 文章被收录于专栏

不定期分享大数据相关技术面经,本着免费原则,随意白嫖

全部评论

相关推荐

评论
1
11
分享
牛客网
牛客企业服务