【问题标题】:PySpark how is pickle used in SparkSql and DataframesPySpark 如何在 SparkSql 和 Dataframes 中使用 pickle
【发布时间】:2017-06-25 18:54:22
【问题描述】:
我试图了解 PySpark 如何将 pickle 用于 RDD,并避免它用于 SparkSql 和 Dataframe。问题的基础来自this链接中的幻灯片#30。我在下面引用它以供参考:
“[PySpark] RDD 通常是腌制对象的 RDD。Spark SQL(和 DataFrames)避免了其中的一些”。
Spark Sql 中如何使用pickle?
【问题讨论】:
标签:
pyspark
spark-dataframe
pickle
pyspark-sql
【解决方案1】:
在最初的 Spark RDD 模型中,RDD 描述了 Java 对象或腌制 Python 对象的分布式集合。但是,SparkSQL“数据帧”(包括数据集)表示针对一个或多个源/父项的查询。
为了评估查询并产生一些结果,Spark 确实需要处理记录和字段,但它们在内部以二进制、与语言无关的格式(称为“编码”)表示。 Spark 可以在需要时将这些格式解码为任何受支持的语言(例如 Python、Scala、R),但如果没有明确要求,则会避免这样做。
例如:如果我在磁盘上有一个文本文件,我想计算行数,我使用如下调用:
spark.read.text("/path/to/file.txt").count()
Spark 不需要将文本中的字节转换为 Python 字符串——Spark 只需要计算它们。
或者,如果我们从 PySpark 执行 spark.read.text("...").show(),那么 Spark 将需要将一些记录转换为 Python 字符串 - 但只有满足查询所需的记录,以及 show()意味着一个 LIMIT,因此只有少数记录被评估和“解码”。
总之,使用 SQL/DataFrame/DataSet API,您用来操作查询的语言 (Python/R/SQL/...) 只是一种“前端”控制语言,而不是执行实际计算,也不需要将原始数据源转换为您使用的语言。这种方法可以在所有语言前端实现更高的性能。