1.Spark支持的分布式部署方式中哪个是错误的

  • Standlone
  • Spark on mesos
  • Spark on YARN
  • Spark on local

<mark>Spark有3种运行模式(分布式部署方式):独立集群运行模式、YARN运行模式、Mesos运行模式。=local错误</mark>

2.熵是为消除不确定性所需要获得的信息量,投掷均匀正六面体骰子的熵是(注:lg2=0.3010,lg3=0.4771)

  • 1比特
  • 2.6比特
  • 3.2比特
  • 3.8比特

3.关于SecondaryNameNode哪项是正确的

  • 它是NameNode的热备
  • 它对内存没有要求
  • 它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间
  • SecondaryNameNode 应与 NameNode 部署到一个节点

<mark>secondarynamenode一般在另外一个节点上运行,需要与namenode一样多大小的内存,作用就是定期合并编辑日志与命名空间镜像,以防止编辑日志过大。
但是该辅助namenode总会滞后于namenode
A中的热备份专门指热备namenode</mark>

4.以下python语句(Python 2.7.13)的执行结果是:

import re
key = r"mat cat hat pat"
p1 = r"[^c|p]at"
pattern1 = re.compile(p1)
print pattern1.findall(key)
  • ['mat', 'hat']
  • [‘cat’, ‘pat’]
  • [‘mat’, ‘hat’, ‘pat’]
  • []

<mark>[]是基于字符的,
[abc]是匹配a, b, c中的 一个 字符,
[^abc]中的 ^ 是表否定, 表示匹配a, b, c之外的字符.
所以和上面相同的结果的另一个正则是 p1 = r"[^cp]at".</mark>

5.下面有关文件系统元数据的描述,说法错误的是

  • 元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息等等
  • 我们可以使用stat命令来查看文件更多的元数据信息
  • Unix/Linux系统允许多个文件名指向同一个inode号码
  • 文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B,这时文件A就称为文件B的&quot;硬链接&quot;

6.在深度学习中,涉及到大量矩阵相乘,现在需要计算三个稠密矩阵A,B,C的乘积ABC,假设三个矩阵的尺寸分别为mn,np,p*q,且m<n<p<q,以下计算顺序效率最高的是

  • (AB)C
  • A(BC)
  • (AC)B
  • 所有效率相同

7.T1中内容为

T2中内容为

查询语句:

select * from T1 left join T2 on T1.id=T2.id and T2.id<>2

请问输出结果是


== left join是外连接,主表的数据是一定会出现的,所以选D==

8.以下几种模型方法属于判别式模型(Discriminative Model)的有

1)混合高斯模型
2)条件随机场模型
3)区分度训练
4)隐马尔科夫模型

  • 2,3
  • 3,4
  • 1,4
  • 1,2

9.下面哪一个步骤是在MapReduce中没有的

  • partition
  • Sort
  • Combine
  • Copy
    <mark>mapreduce实际的处理过程可以理解为Input->Map->Sort->Combine->Partition->Reduce->Output。</mark>

10.select * from tablename where columnA=’a’ union select * from tablename where columnB=’b’ 与此查询语句等价的选项是

select * from tablename where columnA=‘a‘ and columnB=‘b‘
select * from tablename where columnA=‘a‘ or columnB=‘b‘
select * from tablename where columnA=‘a‘
select * from tablename where columnB=‘b‘


<mark>union 关键字的意思是并集去重</mark>

11.以下关于人工神经网络(ANN)的描述错误的有

  • 神经网络对训练数据中的噪声非常鲁棒
  • 可以处理冗余特征
  • 训练ANN是一个很耗时的过程
  • 至少含有一个隐藏层的多层神经网络

<mark>人工神经网络可以没有隐层,直接输入与输出</mark>

12.在hadoop2.6.0集群中的一台服务器上运行jps指令,不可能出现的进程是

  • NameNode
  • DataNode
  • ResourceManager
  • TaskTracker

<mark>TaskTracker是1的组件,2已经没有了</mark>

13.Yarn作为Hadoop2.0中的资源管理器对各类应用程序进行资源管理和调度。请列出Yarn中的关键组件并简述各关键组件内部的交互原理。

<mark>1、关键组件:
ResourceManager(RM)
NodeManager(NM)
ApplicationMaster(AM)
Container
2、交互原理:
(1)RM调度资源并在合适的NM节点上启动对应的AM。AM向RM注册,包含二者之间的握手信息、AM侦听端口,及后续进行AM管理和监控的URL。
(2)RM接收AM注册信息,并反馈响应给AM,包含集群资源信息。
(3)AM向RM发起资源分配请求,包含需要使用的Container个数,同时附带归属于本AM的Container信息。
(4)AM向RM获取资源分配进度信息,并保持与RM之间的心跳。
(5)RM根据资源调度策略,分配容器资源给AM。
(6)AM根据RM反馈信息,指示对应NM完成Container的拉起。一个NM上可以启动多个Container。
(7)在Container运行过程中,AM向NM获取Container的运行状态报告。
(8)NM将Container的运行状态信息反馈给AM。</mark>

14.题目描述 现有1TB文本文件words.txt,文件每行为若干个英文单词,单词间用空格分隔,文件中存在单词word1占据了总单词量的30%以上,其他单词出现频率较为平均。根据以上场景,请描述mapreduce如何统计每个单词出现的频次。

<mark>题中所述文本文件存在明显的数据倾斜问题,word1出现频次远大于其他单词,因此需要对word1在map阶段的输出key值进行构造,从而将word1均分给多个reduce计算。
注:如果只答出一般的wordcount步骤,没有考虑到数据倾斜问题,严格来说应不得分。
1.map阶段
map方法按行读取文件,每行文件按空格分隔为一个单词列表,依次读取每个单词.
若单词为word1,则map阶段的输出为<word1_randomInt(50),1>,即"word1_“加0-50 之间的随机整数。 其他单词直接输出<单词,1>。
注:只要答出map阶段对单词word1的输出key值进行构造,以达到将word1均分为多个不同的key输出的目的即可,具体方法可有所区别。
2.combine阶段
注:计算方法同reduce阶段,该步骤可省去,答出+1分。
3.reduce阶段
对同一key值得value进行累加,得出各个key值的出现次数。
4.计算最终结果。
依次逐行读取reduce阶段输出目录中的所有文件:
a.若key不是形同"word1_XX”,直接输出key和value,即得出对应单词的出现频次。
b.若key类似"word1_XX",对所有key的value值累加,即可得出word1的出现频次。</mark>

15.题目描述 又到一年毕业季,一大批刚刚步入职场的应届生申请办理我行信用卡,为了能最大程度的得到优质的信用卡客户,更精准地确定客户优劣和价值高低。考虑利用机器学习的思想在已有传统人工规则的基础上作辅助决策。针对这个场景,详细描述所需要的数据、数据的处理过程、选择的算法及原因、评价指标等过程。

<mark>更精准地确定客户优劣和价值高低。考虑利用机器学习的思想在已有传统人工规则的基础上作辅助决策。针对这个场景,详细描述所需要的数据、数据的处理过程、选择的算法及原因、评价指标等过程。
算法的选择:传统的规则识别+一些分类算法(LR/cart/rf/gbdt/xgboost/lightgbm/nn/svm等)
特征的选择:用户个人的基本属性信息(年龄、收入、职业、性别等),用户的信用特征信息(贷款信息、征信信息等)、用户的行为信息(金融类APP使用情况、已办理的其他信用卡使用情况、接收相关短信或者是电话拨打情况扥)
处理过程:文本型的数值的编码处理等,数值型的需要进行缺失值、同度量化等,绝对指标和相对指标的选择
指标:ROC曲线的auc值,ks值,F1值,准确率和召回率等</mark>

16. [编程题]信用卡推荐客户列表

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32M,其他语言64M

现在信用卡开展营销活动,持有我行信用卡客户推荐新户办卡,开卡成功后可获得积分奖励。规定每个客户最多可推荐两个新户且一个新户只能被推荐一次。但允许链接效应,即若客户A推荐了新户B,新户B推荐新户C,则客户C同时属于A和B的推荐列表。简单起见,只考虑以一个老客户A作起点推荐的情况。编程计算推荐新户数不小于n的客户列表。

输入描述:
输入的第一行为以空格分隔的两个正整数,第一个表示原始推荐列表的个数m,第二个表示n的取值。
其后m行每行均为一个以空格分隔的原始推荐列表,第一列为推荐人,后面两列为被推荐人,若该推荐人只推荐了一个新户,则第三列以*替代。推荐人和被推荐人均以大写字母表示,不同字母代表不同的人。

输出描述:
在同一行输出符合条件的客户列表,无顺序要求,客户间以空格分隔。若客户列表为空,则输出None。详见样例。

输入例子1:

5 2
A B C
C F *
B D E
D G *
E H I

输出例子1:

A B E
    /*
    一个dfs的问题,也就是说,分以下两步来解决:
    1.开始时没有问题吧,m个人,每个人可以推荐n个,先把这个关系给对应上了
    2.现在要进行dfs,从A开始,我们找当前节点与末尾形成的链子的长度,如果这个长度>+n的,即为符合条件的点
    3.注意题目中说到的,只考虑从A出发的情况,否则我们需要多一步,在m个人中进行遍历
*/
#include <iostream>
#include <vector>
using namespace std;
 
class Solution{
   
public:
    int CalTheLength(vector<vector<int>>& vec,int n,int node,vector<int>& res){
   
        int length=0;
        for(int i=0;i<vec[node].size();++i) //因为只需考虑从A进行出发
            length+=CalTheLength(vec,n,vec[node][i],res);
        if(length>=n)
            res.push_back(node);
        return length+1;
    }
};
int main(){
   
    int m,n;
    cin>>m>>n; //m个人,目标为n个客户
    vector<vector<int>> vec(26,vector<int>()); //初始的对应关系
    while(m--){
   
        char a,b,c;
        cin>>a>>b>>c;
        if(b!='*')
            vec[a-'A'].push_back(b-'A');
        if(c!='*')
            vec[a-'A'].push_back(c-'A');
    }
    vector<int> res;
    Solution sol;
    sol.CalTheLength(vec,n,0,res);
    if(!res.size())
        cout<<"None";
    else{
   
        for(auto it:res)
            cout<<char('A'+it)<<" ";
    }
    return 0;
}

17. [编程题]科室素拓活动

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 64M,其他语言128M

科室素拓进行游戏,游戏规则如下:随机抽取9个人作为游戏参与人员,分别编号1至9,每轮要求k(k<=9且k>=0)个人自由组合使编号之和为n。输出满足规则的所有可能的组合。要求组合内部编号升序输出,组合之间无顺序要求。

输入描述:
输入数据为以空格分隔的两个整数k和n

输出描述:
每行输出一个可能的编号组合,组合内部各个编号以空格分隔升序输出。若无满足规则的组合,则输出None

输入例子1:

3 15

输出例子1:

1 5 9
1 6 8
2 4 9
2 5 8
2 6 7
3 4 8
3 5 7
4 5 6
n,target = list(map(int,input().split()))
candidates = [1,2,3,4,5,6,7,8,9]
result = []
 
def dfs(remain,stack):
    if remain == 0 and len(stack)==n:
        result.append(stack)
        return
         
    for item in candidates:
        if item > remain:
            break
        if stack and item <= stack[-1]:
            continue
        else:
            dfs(remain-item,stack+[item])
             
dfs(target,[])
if result:
    for i in result:
        for j in i:
            print(j,end=' ')
        print('')
else:
    print('None')

<mark>递归算法</mark>