4简单的列转换:将句子拆解为单词列表 29
2.4.1使用select()选择特定的列 30
2.4.2转换列:将字符串拆分为单词列表 31
2.4.3重命名列:alias和withColumnRenamed 33
2.4.4重塑数据:将list分解成行 34
2.4.5处理单词:更改大小写并删除标点符号 36
2.5筛选记录 38
2.6本章小结 40
2.7扩展练习 40
第3章提交并扩展你的第一个PySpark程序 43
3.1对记录进行分组:计算词频 43
3.2使用orderBy对结果排序 46
3.3保存数据帧中的数据 48
3.4整合所有内容:计数 49
3.4.1使用PySpark的导入约定简化依赖 50
3.4.2通过方法链简化程序 51
3.5使用spark-submit以批处理模式启动程序 53
3.6本章未涉及的内容 54
3.7扩展词频程序 55
3.8本章小结 56
3.9扩展练习 57
第4章使用pyspark.sql分析表格数据 59
4.1什么是表格数据 60
4.2使用PySpark分析和处理表格数据 62
4.3在PySpark中读取和评估带分隔符的数据 63
4.3.1第一次使用专门处理CSV文件的SparkReader 63
4.3.2自定义SparkReader对象来读取CSV数据文件 65
4.3.3探索数据世界的轮廓 67
4.4数据操作基础:选择、删除、
重命名、排序及诊断 68
4.4.1了解我们想要什么:选择列 69
4.4.2只保留我们想要的:删除列 71
4.4.3创建新列:使用withColumn()创建新列 73
4.4.4整理数据帧:对列进行重命名和重排序 76
4.4.5用describe()和summary()分析数据帧 78
4.5本章小结 80
4.6扩展练习 80
第5章数据帧操作:连接和分组 83
5.1连接数据 83
5.1.1探索连接的世界 84
5.1.2了解连接的两边 85
5.1.3成功连接的规则:谓词 85
5.1.4连接方法 87
5.1.5连接的命名约定 91
5.2通过groupby和GroupedData汇总数据 94
5.2.1一个简单的分组蓝图 95
5.2.2对自定义列使用agg() 98
5.3处理null值:删除或填充 100
5.3.1立即删除:使用dropna()
删除具有null值的记录 100
5.3.2使用fillna()替换null值 101
5.4问题回顾:端到端程序 102
5.5本章小结 105
5.6扩展练习 105
第Ⅱ部分进级:将你的想法转化为代码
第6章多维数据帧:使用PySpark处理JSON数据 109
6.1读取JSON数据:为schemapocalypse做好准备 109
6.1.1从小处开始:将JSON数据作为受限的Python字典 111
6.1.2更进一步:在PySpark中读取JSON数据 113
6.2用复杂的数据类型突破二维数据 114
6.2.1当有多个值时:使用数组 116
6.2.2映射类型:同一列中的键和值 119
6.3结构体:列中的嵌套列 121
6.4构建和使用数据帧模式 125
6.4.1使用Spark类型作为schema的基本代码块 125
6.4.2使用结构体模式原地读取JSON文档 127
6.4.3循环往复:以JSON格式指定模式 131
6.5进行整合:使用复杂数据类型减少重复数据 133
6.5.1获取“刚刚好”的数据帧:explode和collect 135
6.5.2创建自己的层次结构:作为函数的结构体 138
6.6本章小结 139
6.7扩展练习 139
第7章双语PySpark:混合Python和SQL 141
7.1根据我们的了解:pyspark.sql与普通SQL 142
7.2为SQL准备数据帧 143
7.2.1将数据帧转换为Spark表 144
7.2.2使用Spark目录 145
7.3SQL和PySpark 146
7.4在数据帧方法中使用类似SQL的语法 148
7.4.1获取所需的行和列:select和where 148
7.4.2将相似的记录分组在一起:groupby和orderby 149
7.4.3在分组后使用having进行筛选 150
7.4.4使用CREATE关键字创建新表/视图 151
7.4.5使用UNION和JOIN向表中添加数据 153
7.4.6通过子查询和公共表表达式更好地组织SQL代码 154
7.4.7PySpark与SQL语法的快速总结 157
7.5简化代码:混合SQL和Python 157
7.5.1使用Python提高弹性并简化数据读取阶段 158
7.5.2在PySpark中使用SQL风格的表达式 159
7.6结论 161
7.7本章小结 161
7.8扩展练习 162
第8章使用Python扩展PySpark:RDD和UDF 165
8.1PySpark中的RDD 166
8.2使用Python通过UDF扩展PySpark 173
8.2.1这一切都从简单的Python开始:使用类型化的Python函数 174
8.2.2使用udf()将Python函数转换为UDF 176
8.3本章小结 179
8.4扩展练习 179
第9章大数据就是大量的小数据:使用pandasUDF 181
9.1通过pandas进行列转换:使用SeriesUDF 182
9.1.1将Spark连接到谷歌的BigQuery 183
9.1.2SeriestoSeriesUDF:使用pandas的列函数 188
9.1.3标量UDF+冷启动=SeriesUDF的迭代器 190
9.2分组数据上的UDF:聚合
与应用 193
9.2.1分组聚合UDF 194
9.2.2分组映射UDF 196
9.3何时用,怎么用 198
9.4本章小结 200
9.5扩展练习 200
第10章不同视角下的数据:窗口函数 203
10.1学习并使用简单的窗口函数 204
10.1.1确定每年最冷的一天 204
10.1.2创建并使用一个简单的窗口函数来获取最冷的日子 206
10.1.3比较两种方法 210
10.2除了汇总:使用排名和分析功能 211
10.2.1排名函数:看看谁是第一 212
10.2.2分析函数:回顾过去和展望未来 216
10.3弹性窗口!使用行和范围的边界 218
10.3.1计数,窗口样式:静态、增长和无边界 219
10.3.2范围和行 221
10.4综合实践:在窗口中使用UDF 224
10.5查看窗口:成功的窗口函数的主要步骤 226
10.6本章小结 226
10.7扩展练习 226
第11章加速PySpark:理解Spark的查询计划 229
11.1芝麻开门:通过SparkUI了解Spark环境 229
11.1.1查看配置:Environment选项卡 231
11.1.2Executors选项卡和resourcemanagement选项卡 233
11.1.3了解任务的运行:通过SparkUI判断任务是否完成 237
11.1.4通过Spark查询计划映射操作:SQL选项卡 240
11.1.5Spark的核心:解析、分析、优化和物理计划 242
11.2关于性能:操作和内存 246
11.2.1宽操作与窄操作 246
11.2.2缓存数据帧:功能强大,但往往致命(对于性能而言) 251
11.3本章小结 254
第Ⅲ部分使用PySpark进行机器学习
第12章准备工作:为机器学习准备特征 259
12.1阅读、探索和准备机器学习数据集 260
12.1.1使用toDF()对列名进行标准化 261
12.1.2探索数据并获取第一个特征列 262
12.1.3解决数据错误并构建第一个特征集 264
12.1.4删除无用记录并估算二分类特征 266
12.1.5处理极值:清洗带有连续值的列 268
12.1.6删除不常见的二分类列 271
12.2特征创建和细化 272
12.2.1创建自定义特征 272
12.2.2去除高度相关的特征 273
12.3基于转换器和估计器的特征准备 276
12.3.1使用Imputer估计器填充连续特征 277
12.3.2使用MinMaxScaler估计器对特征进行缩放 279
12.4本章小结 281
第13章通过机器学习管道增强机器学习 283
13.1转换器和估计器:Spark
中机器学习的构建块 284
13.1.1数据进出:转换器 285
13.1.2估计器 289
13.2构建(完整的)机器学习管道 290
13.2.1使用向量列类型组装最终数据集 292
13.2.2使用LogisticRegression分类器训练机器学习模型 295
13.3评估和优化模型 297
13.3.1评估模型准确率:混淆矩阵和评估器对象 298
13.3.2真阳性与假阳性:ROC曲线 300
13.3.3使用交叉验证优化超参数 302
13.4从模型中获取最大的驱动力:提取系数 305
13.5本章小结 307
第14章构建自定义机器学习转换器和估计器 309
14.1创建自己的转换器 309
14.1.1设计转换器:从Param和转换的角度思考 310
14.1.2创建转换器的Param 312
14.1.3getter和setter:成为PySpark中优秀的一员 314
14.1.4创建自定义转换器的初始化函数 316
14.1.5创建转换函数 317
14.1.6使用转换器 319
14.2创建自己的估计器 321
14.2.1设计估计器:从模型到Param 321
14.2.2实现伴生模型:创建自己的Mixin 324
14.2.3创建ExtremeValueCapper估计器 326
14.2.4使用自定义估计器 328
14.3在机器学习管道中使用转换器和估计器 328
14.3.1处理多个输入 329
14.3.2将自定义组件应用于机器学习管道 331
14.4本章小结 334
14.5结论:有数据,我就开心 334
附录A习题答案 337
附录B安装PySpark 369
附录C一些有用的Python内容 389