PySpark 如何在 SparkSql 和 Dataframes 中使用 pickle

PySpark how is pickle used in SparkSql and Dataframes

我试图了解 PySpark 如何将 pickle 用于 RDD 并避免它用于 SparkSql 和 Dataframes。问题的基础来自 this link.I 中的幻灯片#30,我在下面引用它以供参考:

"[PySpark] RDD 通常是腌制对象的 RDD。Spark SQL(和 DataFrames)避免了其中的一些"。

Spark中如何使用pickleSql?

在最初的 Spark RDD 模型中,RDD 描述了 Java 对象或 pickled Python 对象的分布式集合。但是,SparkSQL "dataframes"(包括数据集)代表 queries 对一个或多个 sources/parents。

为了评估查询并产生一些结果,Spark 确实需要处理记录和字段,但这些在内部以二进制、语言中性格式(称为 "encoded")表示。 Spark 可以在需要时将这些格式解码为任何支持的语言(例如,Python、Scala、R),但如果没有明确要求,将避免这样做。

例如:如果我在磁盘上有一个文本文件,我想计算行数,我使用如下调用:

spark.read.text("/path/to/file.txt").count()

Spark 无需将文本中的字节转换为 Python 字符串——Spark 只需要对它们进行计数。

或者,如果我们从 PySpark 执行 spark.read.text("...").show(),那么 Spark 需要将一些记录转换为 Python 字符串——但只有满足查询所需的那些,并且 show() 意味着 LIMIT 因此仅评估少数记录并且 "decoded."

总而言之,使用 SQL/DataFrame/DataSet API,您用来操作查询的语言 (Python/R/SQL/...) 只是一种 "front-end" 控制语言,而不是执行实际计算的语言,也不需要将原始数据源转换为您正在使用的语言。这种方法可以在所有语言前端实现更高的性能。