由于数据量太大而不能在一台机器上进行处理这样的情况已经越来越常见了。幸运的是,已经有Apache Spark、Hadoop等技术被开发出来,去解决这个确切的问题。这些系统的强大功能可以直接在Python中使用PySpark来发掘!
有效地处理GB及以上级别的数据集是任何Python开发者都应该会的,无论你是一个数据科学家、web开发人员还是介于两者之间的任何人员。
在本教程中,你将学习:
- 什么Python概念可以被应用于大数据
- 如何使用 Apache Spark 和PySpark
- 如何编写基本的PySpark程序
- 如何在本地对小型数据集运行PySpark 程序
- 将你的PySpark技巧应用到分布式系统的指南
免费福利: 点击这里访问《Python技巧》中的一章:这本书向你展示了Python的最佳实践和一些简单的例子,你可以立即应用这些例子来编写更漂亮的Python式代码。(https://realpython.com/pyspark-intro/ )
Python中的大数据概念
尽管Python只是一种流行的脚本语言,但是它提供了几种编程范式,比如面向数组编程、面向对象编程、异步编程等等。对于有抱负的大数据专业人士来说,函数式编程是一个特别有趣的范式。
在处理大数据时,函数式编程是一种常见的范例。以函数的方式进行编写会生成高度并行的代码。这意味着将你的代码在多个CPU上或者甚至完全不同的机器上运行要容易的多。你可以同时在多个系统上运行你的代码,这样就可以绕过单个工作站的物理内存和CPU限制。
这就是PySpark生态系统的强大功能,它允许你获取函数代码并将其自动分布到整个计算机集群中。
幸运的是,Python程序员可以在Python的标准库和内置程序中使用函数式编程的许多核心思想。你可以学习大数据处理所需的许多概念,而不必离开Python的舒适环境。
函数式编程的核心思想是数据应该由函数进行操作,而不需要维护任何外部状态。这意味着你的代码避免了全局变量,并且总是会返回新数据,而不是原地操作数据。
函数编程中的另一个常见概念是匿名函数。Python使用lambda关键字定义匿名函数,不要与AWS lambda函数相混淆。
现在你已经了解了一些术语和概念,你可以探索这些思想在Python生态系统中是如何体现的。
Lambda 函数
Python中的lambda函数是内联定义的,并且仅限于一个表达式。在使用内置的sorted()函数时,你可能已经见过lambda函数了:
sorted函数的key参数会被调用来获取iteranle(迭代)中的每个项。这使得排序不区分大小写,方法是在排序之前将所有字符串变为小写。
这是lambda函数的一个常见用例,它是一些小的匿名函数,不维护任何外部状态。
Python中还存在其它常见的函数式编程函数,如filter()、map()和reduce()。所有这些函数都可以使用lambda函数或使用def以类似的方式定义的标准函数。
filter(), map()和 reduce()
内置的filter()、map()和reduce()函数在函数式编程中都很常见。你很快就会看到,这些概念可以构成一个PySpark程序功能的重要部分。
在一个核心Python上下文中理解这些函数非常重要。然后,你就可以将这些知识转换为PySpark程序和Spark API。
filter()根据条件过滤一个iterable,通常会被表示为一个lambda函数:
filter()接受一个iterable,对每个项调用lambda函数,并返回lambda返回True的项。
注意: 调用list()是必需的,因为filter()也是一个迭代. filter()只在你循环遍历它们时才给出值。list()会将所有项强制载入内存,而不是必须使用一个循环。
你可以想象使用filter()去替换一个常见的for循环模式,如下所示:
这段代码会收集所有少于8个字符的字符串。代码比filter()示例更冗长,但是它执行的是相同的函数,得到是相同的结果。
filter()的另一个不太明显的好处是,它会返回一个iterable。这意味着filter()并不需要你的计算机有足够的内存来同时保存iterable中的所有项。随着大数据集快速增长成几GB大小,这一点变得越来越重要。
map()类似于filter(),它也会对一个iterable中的每个项应用一个函数,只不过它总是生成原始项的一个1对1映射。map()返回的新iterable总是具有与原始iterable相同的元素数量,而filter()则不是这样:
map()会在所有的项上自动调用lambda函数,有效地替换了一个for循环,如下所示:
for循环的结果与map()示例相同,后者中收集了所有项的大写形式。但是,与filter()示例一样,map()会返回一个iterable,这再次使得它可以处理无法