目錄
序 1
前言 3
第I 部分 基礎知識
第1 章 Spark 和PySpark 簡介 13
1.1 為什么使用Spark 完成數據分析 14
1.1.1 Spark 生態(tài)系統(tǒng) 17
1.1.2 Spark 架構 18
1.2 PySpark 的能力 .25
1.3 Spark 數據抽象 30
1.3.1 RDD 示例 31
1.3.2 Spark RDD 操作 32
1.3.3 DataFrame 示例 36
1.4 使用PySpark Shell 38
1.4.1 啟動PySpark Shell .40
1.4.2 由集合創(chuàng)建RDD .41
1.4.3 聚合和合并鍵的值 .41
1.4.4 過濾RDD 的元素 43
1.4.5 對類似的鍵分組 44
1.4.6 聚合類似鍵的值 45
1.5 使用DataFrame 的ETL 示例 .46
1.5.1 抽取 47
1.5.2 轉換 48
1.5.3 加載 49
1.6 小結 .50
第2 章 轉換實戰(zhàn) 51
2.1 DNA 堿基計數示例 .52
2.1.1 DNA 堿基計數問題 55
2.1.2 FASTA 格式 55
2.1.3 示例數據 .56
2.2 DNA 堿基計數解決方案1 56
2.2.1 步驟1:由輸入創(chuàng)建一個RDD[String] 57
2.2.2 步驟2:定義一個映射器函數59
2.2.3 步驟3:得出DNA 字母頻度 62
2.2.4 解決方案1 的優(yōu)缺點.64
2.3 DNA 堿基計數解決方案2 65
2.3.1 步驟1:由輸入創(chuàng)建一個RDD[String] 67
2.3.2 步驟2:定義一個映射器函數67
2.3.3 步驟3:得出DNA 字母頻度 69
2.3.4 解決方案2 的優(yōu)缺點.70
2.4 DNA 堿基計數解決方案3 71
2.4.1 mapPartitions() 轉換 71
2.4.2 步驟1:由輸入創(chuàng)建一個RDD[String] 79
2.4.3 步驟2:定義函數處理一個分區(qū) .79
2.4.4 步驟3:對各個分區(qū)應用自定義函數 82
2.4.5 解決方案3 的優(yōu)缺點.84
2.5 小結 .84
第3 章 映射器轉換 87
3.1 數據抽象和映射器 87
3.2 轉換是什么? .89
3.2.1 懶轉換 94
3.2.2 map() 轉換 96
3.2.3 DataFrame 映射器 102
3.3 flatMap() 轉換 .105
3.3.1 map() 與flatMap() 111
3.3.2 對DataFrame 應用flatMap() 111
3.4 mapValues() 轉換 115
3.5 flatMapValues() 轉換 116
3.6 mapPartitions() 轉換 . 118
3.6.1 處理空分區(qū) .121
3.6.2 優(yōu)缺點 125
3.6.3 DataFrame 和mapPartitions() 轉換 .126
3.7 小結 129
第4 章 Spark 中的歸約 131
4.1 創(chuàng)建(鍵,值)對RDD .132
4.2 歸約轉換.134
4.3 Spark 的歸約 136
4.4 簡單熱身示例 139
4.4.1 使用reduceByKey() 的解決方案 140
4.4.2 使用groupByKey() 的解決方案 141
4.4.3 使用aggregateByKey() 的解決方案 142
4.4.4 使用combineByKey() 的解決方案 143
4.5 什么是Monoid ? 144
4.6 電影問題.149
4.6.1 要分析的輸入數據集152
4.6.2 aggregateByKey() 轉換 .153
4.6.3 使用aggregateByKey() 的第一個解決方案 .154
4.6.4 使用aggregateByKey() 的第二個解決方案 .159
4.6.5 使用groupByKey() 的完整PySpark 解決方案 161
4.6.6 使用reduceByKey() 的完整PySpark 解決方案 164
4.6.7 使用combineByKey() 的完整PySpark 解決方案 167
4.7 歸約中的洗牌步驟 .170
4.7.1 groupByKey() 的洗牌步驟 172
4.7.2 reduceByKey() 的洗牌步驟 .173
4.8 小結 174
第II 部分 處理數據
第5 章 數據分區(qū) . 179
5.1 分區(qū)簡介.180
5.2 管理分區(qū).185
5.2.1 默認分區(qū) 186
5.2.2 顯式分區(qū) 187
5.3 為SQL 查詢完成物理分區(qū) 188
5.4 Spark 中的數據物理分區(qū) 192
5.4.1 分區(qū)為文本格式 192
5.4.2 分區(qū)為Parquet 格式 193
5.5 如何查詢分區(qū)數據 .194
5.6 小結 196
第6 章 圖算法 . 199
6.1 圖介紹 .200
6.2 GraphFrames API 202
6.2.1 如何使用GraphFrames .203
6.2.2 GraphFrames 函數和屬性 .207
6.3 GraphFrames 算法 .207
6.3.1 查找三角形 .208
6.3.2 Motif 查找 212
6.4 實際示例.222
6.4.1 基因分析 223
6.4.2 社交推薦 224
6.4.3 Facebook 朋友圈 229
6.4.4 連通分量 234
6.4.5 分析航班數據 .236
6.5 小結 246
第7 章 與外部數據源交互 247
7.1 關系數據庫 248
7.1.1 讀取數據庫 .249
7.1.2 將DataFrame 寫入數據庫 258
7.2 讀取文本文件 263
7.3 讀寫CSV 文件 265
7.3.1 讀CSV 文件 266
7.3.2 寫CSV 文件 270
7.4 讀寫JSON 文件 272
7.4.1 讀JSON 文件 .272
7.4.2 寫JSON 文件 .274
7.5 讀寫Amazon S3 .275
7.5.1 從Amazon S3 讀取 .277
7.5.2 寫入Amazon S3 278
7.6 讀寫Hadoop 文件 280
7.6.1 讀Hadoop 文本文件 281
7.6.2 寫Hadoop 文本文件 284
7.6.3 讀寫HDFS SequenceFile .287
7.7 讀寫Parquet 文件 288
7.7.1 寫Parquet 文件 .289
7.7.2 讀Parquet 文件 .291
7.8 讀寫Avro 文件 292
7.8.1 讀Avro 文件 292
7.8.2 寫Avro 文件 293
7.9 讀寫MS SQL Server .294
7.9.1 寫MS SQL Server 294
7.9.2 讀MS SQL Server 295
7.10 讀取圖像文件 295
7.11 小結 297
第8 章 排名算法 . 299
8.1 秩序乘積.300
8.1.1 計算秩序乘積 .301
8.1.2 秩序乘積描述 .301
8.1.3 秩序乘積示例 .302
8.1.4 PySpark 解決方案 304
8.2 PageRank 310
8.2.1 PageRank 的迭代計算 313
8.2.2 使用RDD 的自定義PySpark PageRank 算法實現 315
8.2.3 使用鄰接矩陣的自定義PySpark PageRank 算法實現 318
8.2.4 使用GraphFrames 實現的PageRank 321
8.3 小結 322
第III 部分 數據設計模式
第9 章 經典數據設計模式 327
9.1 輸入?C 映射?C 輸出 .328
9.1.1 RDD 解決方案 329
9.1.2 DataFrame 解決方案 332
9.1.3 扁平映射器功能 334
9.2 輸入?C 過濾?C 輸出 .336
9.2.1 RDD 解決方案 337
9.2.2 DataFrame 解決方案 337
9.2.3 DataFrame 過濾器 338
9.3 輸入?C 映射?C 歸約?C 輸出 .340
9.3.1 RDD 解決方案 340
9.3.2 DataFrame 解決方案 344
9.4 輸入?C 多重?C 映射?C 歸約?C 輸出 346
9.4.1 RDD 解決方案 348
9.4.2 DataFrame 解決方案 350
9.5 輸入?C 映射?C 組合器?C 歸約?C 輸出351
9.6 輸入?C 映射分區(qū)?C 歸約?C 輸出 355
9.7 倒排索引.359
9.7.1 問題陳述 360
9.7.2 輸入 .360
9.7.3 輸出 .360
9.7.4 PySpark 解決方案 361
9.8 小結 364
第10 章 實用數據設計模式 367
10.1 映射器內部組合 368
10.1.1 基本MapReduce 算法 .370
10.1.2 按記錄映射器內部組合 372
10.1.3 按分區(qū)映射器內部組合 374
10.2 Top-10 377
10.2.1 Top-N 形式化描述 .380
10.2.2 PySpark 解決方案 .381
10.2.3 查找Bottom 10384
10.3 MinMax 385
10.3.1 解決方案1:傳統(tǒng)MapReduce 385
10.3.2 解決方案2:排序 .386
10.3.3 解決方案 3:Spark 的mapPartitions() 386
10.4 復合模式和Monoid 390
10.4.1 Monoid 391
10.4.2 Monoid 和非Monoid 示例 395
10.4.3 非Monoid MapReduce 示例 .399
10.4.4 Monoid MapReduce 示例 401
10.4.5 Monoid 均值計算的PySpark 實現 403
10.4.6 函子和幺半群 406
10.4.7 幺半群使用小結 .408
10.5 分箱 408
10.6 排序 412
10.7 小結 413
第11 章 連接設計模式 . 415
11.1 連接操作介紹 415
11.2 MapReduce 中的連接 418
11.2.1 映射階段 419
11.2.2 歸約器階段 420
11.2.3 PySpark 實現 421
11.3 使用RDD 的映射端連接 .422
11.4 使用DataFrame 的映射端連接 .427
11.4.1 步驟1:創(chuàng)建Airports 緩存 429
11.4.2 步驟2:創(chuàng)建Airlines 緩存 429
11.4.3 步驟3:創(chuàng)建事實表 .430
11.4.4 步驟4:應用映射端連接 431
11.5 使用Bloom 過濾器的高效連接 431
11.5.1 Bloom 過濾器 432
11.5.2 一個簡單的Bloom 過濾器示例 434
11.5.3 Python 中的Bloom 過濾器 435
11.5.4 PySpark 中使用Bloom 過濾器 435
11.6 小結 436
第12 章 PySpark 中的特征工程 439
12.1 特征工程介紹 441
12.2 增加新特征 .443
12.3 應用UDF .444
12.4 創(chuàng)建管道 444
12.5 二值化數據 .447
12.6 填充 449
12.7 分詞 451
12.7.1 Tokenizer 452
12.7.2 RegexTokenizer 453
12.7.3 管道分詞 453
12.8 標準化 454
12.9 歸一化 457
12.9.1 使用管道縮放一列 459
12.9.2 在多列上使用 MinMaxScaler 460
12.9.3 使用Normalizer 歸一化 .461
12.10 字符串索引 462
12.10.1 對單列應用StringIndexer463
12.10.2 對多列應用StringIndexer464
12.11 向量組合 464
12.12 分桶 .466
12.12.1 Bucketizer 467
12.12.2 QuantileDiscretizer .468
12.13 對數轉換 469
12.14 獨熱編碼 471
12.15 TF-IDF 477
12.16 FeatureHasher .482
12.17 SQLTransformer .483
12.18 小結 .484