介绍
大数据的一个关键方面是数据帧。Pandas 和 Spark是最受欢迎的两种类型。然而,Spark 更适合处理规模化的分布式数据,而 Pandas 则不适合。相比之下,Pandas 的 API 和语法更易于使用。
一个名为 Koalas 的库使用户可以利用这两个库,从而使他们不必从两者中进行选择!
这篇文章描述了 Koalas 的基本原理,然后讨论了使用不同 spark 版本的不同库的使用。然后讨论 Koalas 和 Pandas 之间的差异,并进行测试以验证这些差异。目的是帮助读者在前者中打下坚实的基础。让我们开始吧。
为什么选择 Koalas ?
Koalas 库之所以被引入,是因为当前 spark 系统中存在以下问题。
- Apache Spark 中缺少数据科学中经常需要的几个功能。具体来说,绘制图表是几乎所有数据科学家每天都在使用的基本功能。
- 通常,数据科学家更喜欢 pandas 的 API,但如果他们需要扩展工作负载,则很难将它们切换到 PySpark API。这是因为与 pandas 相比,PySpark API 难以学习并且包含许多限制。
Koalas 库变种
要在 spark notebook 中使用 Koalas,需要导入库。库中有两个可用选项。第一个选项是“ databricks.koalas ”,在 PySpark 版本 3.2.x 之前,这是唯一可用的选项。但是在 3.2.x 之后,引入了另一个名为“ pyspark.pandas ”的库,这个名称更符合 Pandas API [3]。Spark 建议使用后者,因为前者将很快停止支持。
Koalas 与 Pandas
简单地说,你可以将 Koalas 视为包裹在 pandas 封面下的 PySpark 数据框。你拥有 Koalas 中 spark 数据框和 Pandas 交互方式的所有优势。Koalas API 将 spark 速度和 pandas 更好的可用性结合在一起,创建了一个功能强大且用途广泛的 API。下图中以图形方式描述了相同的概念。
pandas 和 koalas 之间的关键相似之处在于两个库中使用的 API 相同。也就是说,如果 pandas 使用pd.DataFrame(),那么在 koalas 中,API 的使用也是一样的,即kl.DataFrame()。
然而,两个数据框( Pandas 和 Koalas )之间的差异使得 Koalas 真的很特别。也就是说, Koalas 的数据帧是分布式的——类似于 spark 数据帧。
与其他 spark 库不同,Pandas 在驱动程序的单个节点上运行,而不是在所有工作节点上运行,因此无法扩展。与 Pandas 不同的是,Pandas API(又名 koalas)的工作方式与 spark 库完全相同。
为了理解这两个术语,让我们使用一个示例程序(参考GitHub(https://github.com/ukashishgarg/pyspark/blob/main/articles/dataframe_eval.py))进行一些测试,以确认上述差异。
进行的第一个测试是检查计数操作如何在data bricks环境中执行。此外,如果分别比较 spark、koalas 和 pandas 数据帧的三个计数操作,检查是否观察到任何不同。
输出如下图所示。它确认 pandas 的数据框不使用工作线程。这是因为在对 pandas 的数据框执行操作时,你不会看到任何 spark 作业运行(请参阅下图)。对此,spark 和 koalas 数据框的工作方式不同。他们的 Spark 创造了jobs 来完成计数操作。这些工作是由两个独立的 workers (又名machines)创建的。这个测试证实了两件事:
- 首先, Spark 和 Koalas 在工作方面没有什么不同。
- 其次,当数据负载增加时,Pandas 是不可扩展的(即无论数据大小如何,它总是在驱动程序上的单个节点下工作)。而 Koalas 可以随着数据大小的变化而缩放。
示例程序中执行的第二个测试是对不同数据帧的性能检查。这里计算了计数操作的执行时间。下表清楚地显示了与 pandas 相比,spark 和 koalas 中的记录计数操作需要大量时间。这证明了它们下面只是 spark 数据框。这里要注意的另一个重点是 Pandas 的计数性能远远领先于其他两个。
![](http://qiniu.aihubs.net/考拉 (1).png)
第三个测试再次确认两者是相似的,因为如果下面的两个实体相同,则数据块需要执行的操作并不多.
为了测试这一点,我们在data bricks笔记本中进行了性能测试,分别测试了将 spark 数据帧转换为 Koalas 和 Pandas 时的操作完成时间。
此处显示的输出表明, Koalas 的转换时间与 Pandas 的转换时间相比可以忽略不计。这是因为 Koalas 的数据框结构相同,spark也没什么可做的。
使用 Delta Table 中的复杂数据结构评估 Koalas Read API
现代 delta Lake 中最常见的数据持久化方式是 delta 格式。Azure Databricks 增量表支持类似于事务数据库表的 ACID 属性。值得检查一下 koalas (pandas API) 如何与包含复杂 JSON 嵌套结构的 delta 表一起工作。
示例数据结构
此处显示的示例数据包含两列。首先是银行分行 ID(简单数据),其次是部门详细信息(复杂的嵌套 JSON 结构)。此数据存储为增量表。
示例数据 - 代码
可以使用以下代码创建示例数据。完整的代码库可在 GitHub 上找到。
# create payloads
payload_data1 = {"EmpId": "A01", "IsPermanent": True, "Department": [{"DepartmentID": "D1", "DepartmentName": "Data Science"}]}
payload_data2 = {"EmpId": "A02", "IsPermanent": False, "Department": [{"DepartmentID": "D2", "DepartmentName": "Application"}]}
payload_data3 = {"EmpId": "A03", "IsPermanent": True, "Department": [{"DepartmentID": "D1", "DepartmentName": "Data Science"}]}
payload_data4 = {"EmpId": "A04", "IsPermanent": False, "Department": [{"DepartmentID": "D2", "DepartmentName": "Application"}]}
# create data structure
data =[
{"BranchId": 1, "Payload": payload_data1},
{"BranchId": 2, "Payload": payload_data2},
{"BranchId": 3, "Payload": payload_data3},
{"BranchId": 4, "Payload": payload_data4}
]
# dump data to json
jsonData = json.dumps(data)
# append json data to list
jsonDataList = []
jsonDataList.append(jsonData)
# parallelize json data
jsonRDD = sc.parallelize(jsonDataList)
# store data to spark dataframe
df = spark.read.json(jsonRDD)
将临时数据存储到增量表
现在使用此处显示的代码将上面创建的临时员工数据持久保存到增量表。
table_name = "/testautomation/EmployeeTbl"
(df.write
.mode("overwrite")
.format("delta")
.option("overwriteSchema", "true")
.save(table_name))
dbutils.fs.ls("./testautomation/")
使用 Koalas 的数据框读取复杂的嵌套数据
import pyspark.pandas as ps
pdf = ps.read_delta(table_name)
pdf.head()
在执行上述代码时,出现以下输出。
使用 Spark 数据框读取复杂的嵌套数据
df = spark.read.load(table_name)
display(df)
输出:
图 7:复杂的 JSON 数据——通过 Display 函数显示
以上结果表明 Pandas API (Koalas) 在调用 HEAD 函数以显示复杂的 JSON 嵌套结构时效果不佳。这与使用 Koalas 库的主要原则背道而驰,因为其最终目的是使用 Pandas 的功能在 Pandas 库中提供分布式机制。但是,这可以通过一种解决方法来实现,你可以在 Koalas 的数据框中使用 DISPLAY 函数。
结论
这篇文章为读者的 Koalas 图书馆打下了坚实的基础。此外,为验证 Pandas 和 Koalas 之间的差异而进行的不同测试表明, Koalas 只是使用 Pandas API 添加到它们的 Spark 数据帧。
在这篇文章中,我们讨论了阻止 Panda 的“head”函数正确显示嵌套 JSON 数据的限制。总而言之,作为分析和转换大数据的主要方法,Koalas 是一个不错的选择,但要注意它的局限性,以便在某些 API 可能无法正常工作的情况下制定后备计划。
关键要点
- 通过允许数据工程师和数据科学家更有效地与大数据交互, Koalas 提高了生产力。
- 确保在将 Koalas 用于复杂的嵌套 JSON 结构之前进行一些研究,因为它的 API 可能不会产生预期的结果。
- Koalas 在很大程度上弥合了 Pandas API 的单节点使用和分布式数据之间的差距。