|
|
# Spark简单使用心得
|
|
|
- Spark SQL
|
|
|
|
|
|
## 开发环境
|
|
|
- IDEA
|
|
|
- Scala插件
|
|
|
- sbt
|
|
|
- sbt-assembly插件
|
|
|
|
|
|
## id关联库项目中用Spark干了什么
|
|
|
1. 融合
|
|
|
- qcc源库中有人的pid和公司的fid
|
|
|
- 在tb_person表中保存(pid, ppid)的关系
|
|
|
- 在tb_company表中保存(fid, digest)的关系
|
|
|
- 在融合库中,保存人企关系,里面保存人的ppid和公司的digest
|
|
|
- 读5个亿级别大表(数据量7亿),写4亿数据,关联8次,排序3次,25分钟
|
|
|
- 之后`load data`进数据库
|
|
|
2. 事后检测/修复
|
|
|
- 数据融合时,检测是否所有的pid都能关联到ppid
|
|
|
- 筛选错误数据,快速确定数据量,导出爬虫任务重新采集
|
|
|
- 筛选关联库较工商库少的数据,导出爬虫任务
|
|
|
3. 统计
|
|
|
- 将digest与hudi表进行关联,统计不同企业类型不同经营状态的数量,Spark直接将统计数据写入数据库(因为数据量小所以可以直接写)
|
|
|
4. 交互式分析数据
|
|
|
|
|
|
## 概念理解
|
|
|
### Spark Application
|
|
|

|
|
|
|
|
|
### RDD
|
|
|
- `RDD`
|
|
|
- `partitions`
|
|
|
- `partitioner`
|
|
|
- `dependencies`
|
|
|
- `compute`
|
|
|
- `preferredLocations`
|
|
|
- `transform`, `action`
|
|
|
- 早期API
|
|
|
- 处理非结构化数据
|
|
|
|
|
|
### DataFrame/Dataset
|
|
|
- `RDD`提供的算子太抽象,难以优化
|
|
|
- `DataFrame` 即 `Dataset[Row]`
|
|
|
- 带schema,甚至推断schema,可以优化 (Tungsten)
|
|
|
- `DataSet`提供DSL算子,可以优化 (Catalyst)
|
|
|
- `select`
|
|
|
- `where`
|
|
|
- `$`
|
|
|
- `+`
|
|
|
- `>`
|
|
|
- ...
|
|
|
- 类型安全
|
|
|
|
|
|
## 使用心得
|
|
|
- 能配置化的东西配置化 (pureconfig)
|
|
|
- 多使用`Dataset`的DSL方法,而非SQL语句
|
|
|
|
|
|
# 参考
|
|
|
- [Scala](https://docs.scala-lang.org/overviews/scala-book/introduction.html)
|
|
|
- [sbt](https://www.scala-sbt.org/1.x/docs/)
|
|
|
- [SparkSQLExample](https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/sql/SparkSQLExample.scala)
|
|
|
- [A Tale of Three Apache Spark APIs: RDDs vs DataFrames and Datasets](https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html)
|
|
|
|