0%

快手大数据开发实习生二面面经

面试描述

  1. 自我介绍

  2. 自我介绍完了之后什么都没问直接让写题. 大数相减:给定字符串表示的两个正整数,长度很长,求差值。 和面试官交流后得知字符串中只含0-9的字符, 并且没有前导0, 即没有”000102”这种情况.

    String subtract(String a, String b)

    结果一定要注意去除前导0, 比如10000-9999这样的, 要把前面的0去掉 我一开始就忘了, 在面试官提醒下才想起来

  1. 写SQL.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sql:给定一个访问的hive表
    user_id, timestamp,... p_date p_date是分区字段
    要求次日留存,结果给我user_id的集合
    --- 留存是指的当天和昨天都访问了的用户, 实际上就是把今天用户的集合和昨天用户的集合取个交集就完事. 一开始还想着用窗口函数, 后来发现没这么麻烦.

    select todayUser.user_id from
    (
    select user_id, min(p_date) from hiveTable where p_date = "${today}"
    group by user_id
    ) as todayUser inner join
    (
    select user_id, min(p_date) from hiveTable where p_date = "${yesterday}"
    group by user_id
    ) as yesterdayUser
    on todayUser.user_id = yesterdayUser.user_id;
  2. 讲一讲刚才的Hive SQL语句如果放到spark里面执行的过程是怎么样的? (注意, 从hive中取数的时候要根据p_date是分区字段来取, 而不是读取全部的hive数据再用filter()算子过滤)

  3. Scala和Java比有什么不一样的地方?

  4. 介绍一下Scala的模式匹配

  5. Spark惰性执行的优点有什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.Scanner;
import java.util.*;
public class Main {
String subtract(String a, String b){
if(a == null || b == null){
throw new NullPointerException();
}
if("".equals(a) || "".equals(b)){
throw new IllegalArgumentException();
}
String ans = "";
boolean isNegative = false;
if(a.length() > b.length()){
ans = sub(a,b);
}
else if(a.length() < b.length()){
ans = sub(b,a);
isNegative = true;
}
else{
if(a.compareTo(b) > 0){
ans = sub(a,b);
}
else if(a.compareTo(b) < 0){
ans = sub(b,a);
isNegative = true;
}
else{
return "0";
}
}
return (isNegative) ? "-" + ans : ans;
}
private String sub(String a, String b){
StringBuilder sba = new StringBuilder(a).reverse();
StringBuilder sbb = new StringBuilder(b).reverse();
StringBuilder ans = new StringBuilder();
int carry = 0;
for(int i = 0; i < sba.length(); ++i){
int ai = sba.charAt(i) - '0';
int bi = (i < sbb.length()) ? sbb.charAt(i) - '0' : 0;
if(ai < bi + carry){
ai += 10;
ans.append(ai - bi - carry + '0');
carry = 1;
}
else{
ans.append(ai - bi - carry + '0');
}
}
if(carry == 1){
throw new RuntimeException();
}
String ans1 = ans.reverse().toString();
for(int i = 0; i < ans1.length(); ++i)
{
if(ans1.charAt(i) != '0'){
return ans1.substring(i);
}
}
return "0";
}
public static void main(String[] args) {
//Scanner in = new Scanner(System.in);
//int a = in.nextInt();
//System.out.println(a);
System.out.println("Hello World!");
}
}