kafka基本操作

kafka版本

kafka_2.11-0.11.0.1

配置server.properties

broker.id: 唯一,填数字
host.name:唯一,填计算机名
zookeeper.connect=(ip1:port,ip:port)

先启动zookeeper,再启动kafka-server

1
bin/kafka-server-start.sh config/server.properties

创建topic

1
2
3
4
5
6
#create
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic mykafka
# list
kafka-topics.sh --list --zookeeper localhost:2181
# details
kafka-topics.sh --describe --zookeeper localhost:2181

启动生产者

1
2
kafka-console-producer.sh --brokelist localhost:9092 --topic mykafka
# 向主题发布一些信息

启动消费者

1
2
3
4
kafka-console-consumer.sh --zookeeper localhost:2181 --topic mykafka --from-beginning
# --from-beginning 从头开始
# 无 --from-beginning 忽略以前的消息

ETL面试准备

sql基础知识(sql,hive-sql)

hbase 基础知识

hive 基础知识

数据仓库基础知识

Extract-Transform-Load

Extract

udf使用场景

UDF的引入极大地丰富了Spark SQL的表现力。一方面,它让我们享受了利用
Scala(当然,也包括Java或Python)
更为自然地编写代码实现函数的福利,另一方面,又能精简SQL(或者DataFrame的API),更加写意自如地完成复杂的数据分析

编写的UDF可以放到SQL语句的fields部分,也可以作为where、groupBy或者having子句的一部分。

既然是UDF,它也得保持足够的特殊性,否则就完全与Scala函数泯然众人也。这一特殊性不在于函数的实现,而是思考函数的角度,需要将UDF的参数视为数据表的某个列。

当然,我们也可以在使用UDF时,传入常量而非表的列名。让我们稍稍修改一下刚才的函数,让长度10作为函数的参数传入:

获取数组类型json字符串中某一字段的值

udaf使用场景

普通的UDF却也存在一个缺陷,就是无法在函数内部支持对表数据的聚合运算。例如,当我要对销量执行年度同比计算,就需要对当年和上一年的销量分别求和,然后再利用同比公式进行计算。此时,UDF就无能为力了。

这样的需求在实际项目中是很普遍的:请求参数经常以json格式存储在数据库中

spark-sql 所有内置函数

//要使用Spark SQL的内置函授,就一定要导入SQLContext下的隐式转换
org.apache.spark.sql.functions

Spark SQL内置函数解密与实战

sql解决不了的问题

简述map-reduce 模型

map-reduce 与spark 模型(DAG)对比分析

map-reduce模型的一般性

map-reduce 过程详解

mapReduce框架负责处理了分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题
把处理过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来

hbase注意要点

hbase 二次排序

问二次排序是什么,二次排序要继承什么接口?

三种排序三种查找

冒泡

快速排序

二分法查找 -scala

建立在有序的条件下

二叉树查找

前提条件

如何保证下标的有效性 (奇数+偶数)/2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def binarySearch(arry:Array[Int], needed:Int):Int={
var left = 0
var right = arry.length -1
while(left < right) {
val mid:Int = (right - left)/2 + left
needed match {
case _ if needed > arry.apply(mid) => left = mid
case _ if needed < arry.apply(mid) => right = mid
case _ if needed == arry.apply(mid) => return mid + 1
}
}
return -1
}

红黑树遍历

二叉树遍历

scala计算用户基站停留时间

测试数据

18688888888,20160327082400,16030401EAFB68F1E3CDF819735E1C66,1
18611132889,20160327082500,16030401EAFB68F1E3CDF819735E1C66,1
18688888888,20160327170000,16030401EAFB68F1E3CDF819735E1C66,0
18611132889,20160327180000,16030401EAFB68F1E3CDF819735E1C66,0

程序步骤

整理数据

1
2
3
4
5
6
7
8
9
//整理数据
val PhNoLacAndTime: RDD[((String, String), Long)] = baseLog.map(line => {
val fields = line.split(",")
val phoneNo = fields(0)
val lac = fields(2)
val eventType = fields(3)
val time = if (eventType.equals("1")) -fields(1).toLong else fields(1).toLong
((phoneNo, lac), time)
})