HDFS综合之面试题汇总

    Windows Windows 1年前 (2019-08-15) 57次浏览 已收录 0个评论 扫描二维码

    1、x=np.linspace(0,10,100) 生成array([0,10,20,30…,110])(包含初始值和结束值)

    2、简单的例子

    把绘图窗口分成两行两列四块区域,然后在每个区域分别作图,基本步骤:

    subplot(2,2,1); % 2、2、1之间没有逗号也可以

    在第一块绘图

    subplot(2,2,2);

    在第二块绘图

    subplot(2,2,3);

    在第三块绘图

    subplot(2,2,4);

    在第四块绘图

    3、ctrl+shift+F10 快速运行当前脚本

    4、对函数与坐标轴之间的区域进行填充,使用fill函数

    填充两个函数之间的区域,使用fill_between函数

    5、区别。画一个图和画两个图之间函数的差别。

    plt.xlabel() ax.set_xlabel()

    plt.ylabel() ax.set_ylabel()

    plt.xlim() ax.set_xlim()

    plt.ylim() ax.set_ylim()

    plt.title() ax.set_title()

    ax.set(xlim=(0,10),ylim=(),xlabel=,title=)

    6、

    rng=numpy.random.RandomState(23355)

    arrayA=rng.uniform(0,1,(2,3))

      

    该段代码的目的是产生一个2行3列的assarray,其中的每个元素都是[0,1]区间的均匀分布的随机数

    这里看以看到,有一个23355这个数字,其实,它是伪随机数产生器的种子,也就是“the starting point for a sequence of pseudorandom number”

    对于某一个伪随机数发生器,只要该种子(seed)相同,产生的随机数序列就是相同的

    rng=numpy.random.RandomState(0)

    rng.rand(5)

    随机产生5个0,1之间的均匀分布的随机数。

    7、少用subplots,用subplot,像MATLAB那样去编程。

    8、

    for marker in [‘o’,’.’,’,’,’x’,’+’,’v’,’^’,'<‘,’>’,’s’,’d’]:

    plt.plot(rng.rand(5),rng.rand(5),marker, label=”marker={0}”.format(marker),markersize=15,

    markerfacecolor=’white’,markeredgewidth=2,

    markeredgecolor=(0,0,0.4,0.1))

    plt.legend(numpoints=1)

    plt.xlim(0,1.8)

    format(marker)里面的marker指的是变量marker!!!

    9、cyan是青色的意思

    ‘–c’绘制青色线条。

    10、

    通过 iterable 对象来迭代

     

    for i in range(1000): pass

    会导致生成一个 1000 个元素的 List,而代码:

     

    for i in xrange(1000): pass

      

    11、

    如何输出合并单元格的内容

    >>> merge = []

    >>> for (rlow,rhigh,clow,chigh) in sheet2.merged_cells:

    … merge.append([rlow,clow])

    …>>> merge

    [[1, 4], [3, 4], [5, 1]]

    >>> for index in merge:

    … print sheet2.cell_value(index[0],index[1])

    friend

    friend2

    None

    12、

    from matplotlib.font_manager import *

    myfont =

    FontProperties(fname=‘D:\Python\Lib\site-packages\matplotlib\mpl-data/fonts/ttf/arcdps_font.ttf’)
    mpl.rcParams[‘axes.unicode_minus’]=False

    plt.xlabel(年份,fontproperties=myfont)
    plt.ylabel(低保数额(元),fontproperties=myfont)

    plt.legend(prop =myf

    内容:
    1.时间数值相关处理函数
    2.字符串相关处理函数
    3.case函数

    1.时间数值相关处理函数

    select getdate() --获取当前数据库系统时间值
    select getutcdate() --获取当前国际标准时间值
    
    select convert(varchar(),getdate(),style)--convert函数是把日期转换为新数据类型的通用函数
    select datediff(minute/hour/day/month/year,'2018-10-01 00:00:10','2018-10-02 10:00:00')--查询时间间隔
    select DATEADD(day,5,'2018-10-01')  --对指定时间增加间隔,增加为天数,5天(也可以为-5)
    select datepart(dd /mm/yy,getdate())  ---获取时间数据部分信息,返回结果为数值
    select datename(dd,getdate())  --与datepart函数类似,返回结果为字符
    select year()/month()/day() --获取指定时间信息
    convert 函数相关参数
    style idstyle 格式
    100 /0mon dd yyyy hh:miAM (或者 PM)
    101mm/dd/yy
    102yy.mm.dd
    105dd-mm-yy

    2.字符串相关处理函数

    字符串关键内容位置查找: charindex/patindex
    select CHARINDEX('A','NBA',N)  --A 查找值,NBA查找范围,N查找的起始位置,默认0
    select PATINDEX('%A','NBA')  --加入同配符可模糊查找,若A的位置与查找范围的位置不一样,则无法找到,如'A%'在'NBA' 返回结果为0
    
    字符串内容截去/提取: stuff/substring left right
    select STUFF('NBA',2,2,'00AA')  --修改字段'NBA',起始的截去位置,截去长度,插入的内容
    select SUBSTRING('STANDERQUERY',3,10) --提取字段,起始位置,提取长度
    select left('stand',4)  --从左到右顺序提取内容,提取长度
    select right('stand',4) --从右到左顺序提取内容,提取长度
    
    空格去除:ltrim/rtrim
    select LTRIM( '  miss you  ')  --去除字符串起始的空格
    select RTRIM( '  miss you  ')  --去除字符串末尾处的空格
    
    大小写转换:upper/lower
    select UPPER('abcD') --转换为大写的格式
    select LOWER('ABCD') --转换为小写的格式
    
    内容替换:replace
    select REPLACE('ABCB','B','D')  --内容,被替换值,替换值;所有被替换值都会替换
    
    重复输出内容:replicate
    select REPLICATE('ABC',5)  --重复输出内容5次;ABCABCABCABCABC
    
    空格输出:space
    select 'a'+SPACE(2)+'c'  --输出两个空格
    
    倒序输出:reverse
    select REVERSE('123456') --输出654321
    
    数据类型转换:cast
    select cast(12.5 as int)
    

    3.case函数

    SELECT *,
    CASE WHEN userage<=12 then '较小'       --匹配的内容转换为指定内容
    when userage<14 and userage>12  then '小'
    else '适合' end   --结尾必须用end
    FROM userinfo

    Hive基于HADOOP来执行分布式程序的,和普通单机程序不同的一个特点就是最终的数据会产生多个子文件,每个reducer节点都会处理partition给自己的那份数据产生结果文件,这导致了在HADOOP环境下很难对数据进行全局排序,如果在HADOOP上进行order by全排序,会导致所有的数据集中在一台reducer节点上,然后进行排序,这样很可能会超过单个节点的磁盘和内存存储能力导致任务失败。

    1. order by

    Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,但是只能有一个partition,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这将会消耗很长的时间去执行。
    这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

    2. sort by

    sort by 排序出来的数据是局部有序的,但是全局无序。即partition内部是有序的,但是partition与partition之间的数据时没有顺序关系的。

    Hive中指定了sort by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,但是不能保证所有的数据是有序的,除非只有一个reducer),好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率(其实就是做一次归并排序就可以做到全局排序了)。

    3. distribute by和sort by一起使用

    ditribute by是控制map的输出在reducer是如何划分的,举个例子,我们有一张表,mid是指这个store所属的商户,money是这个商户的盈利,name是这个store的名字

    store:

    mid money name
    AA 15.0 商店1
    AA 20.0 商店2
    BB 22.0 商店3
    CC 44.0 商店4
    执行hive语句:

    select mid, money, name from store distribute by mid sort by mid asc, money asc
    我们所有的mid相同的数据会被送到同一个reducer去处理,这就是因为指定了distribute by mid,这样的话就可以统计出每个商户中各个商店盈利的排序了(这个肯定是全局有序的,因为相同的商户会放到同一个reducer去处理)。这里需要注意的是distribute by必须要写在sort by之前。

    若发生将一个使用LZO压缩过的表数据导入一个没有被压缩过表内,

    类似于如下两个表:

    图一:LZO压缩

    HDFS综合之面试题汇总

    图二未压缩

    HDFS综合之面试题汇总
    查询将出现这种状况,hdfs目录下明明有数据,count(*)有数据总量,但是select就是查询不出来,
    具体原因:
    表的结构是未压缩过的,但是数据是压缩过的,通过select(此处查询的方法跟表的结构有关系)查询压缩过的结果,肯定不会显示,

    具体解决办法:
    使用select的时候指定对应的压缩方法就可以查询出来压缩过的数据,类似于下:

    SET hive.exec.compress.output=true;
    SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;

    select * ….就可以查到数据了。

    若发生将一个使用LZO压缩过的表数据导入一个没有被压缩过表内,

    类似于如下两个表:

    图一:LZO压缩

    HDFS综合之面试题汇总

    图二未压缩

    HDFS综合之面试题汇总
    查询将出现这种状况,hdfs目录下明明

    7.HDFS综合_面试题汇总

    有数据,count(*)有数据总量,但是select就是查询不出来,

    具体原因:

    表的结构是未压缩过的,但是数据是压缩过的,通过select(此处查询的方法跟表的结构有关系)查询压缩过的结果,肯定不会显示,

     

    具体解决办法:
    使用select的时候指定对应的压缩方法就可以查询出来压缩过的数据,类似于下:

    SET hive.exec.compress.output=true;
    SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;

    select * ….就可以查到数据了。

    4. cluster by

    cluster by的功能就是distribute by和sort by相结合,如下2个语句是等价的:

    select mid, money, name from store cluster by mid
    select mid, money, name from store distribute by mid sort by mid
    如果需要获得与3中语句一样的效果:
    select mid, money, name from store cluster by mid sort by money
    注意被cluster by指定的列只能是降序,不能指定asc和desc。

    注意:

    distribute by不必非要跟sort by一起用,单独使用distribute by即相当于聚合,加上sort by就是对聚合后各类分别排序。一起使用能实现某些场景而已。

    SELECT *, CASE userage WHEN 12 then ‘较小’ –该写法只适合指定值使用,字段在when 前 when 13 then ‘小’ else ‘适合’ end –结尾必须用end FROM userinfo ont)

    解决字体问题

    13、

    print(df.sum(axis=1)),数组内部相加,总个数为数组个数。

    print(df.sum(axis=0)),数组对应位置数字相加,总个数为单个数组中数字的个数。

    14、

    matplotlib.rcParams[‘font.sans-serif’] = [‘SimHei’]

    matplotlib.rcParams[‘axes.unicode_minus’] = False

    喜欢 (0)
    [1353713598@qq.com]
    分享 (0)
    发表我的评论
    取消评论
    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址