PySpark如何在SparkSql和Dataframes中使用pickle

时间:2017-06-25 18:54:23

标签: pyspark spark-dataframe pickle pyspark-sql

我试图理解PySpark如何将pickle用于RDD并避免使用SparkSql和Dataframes。问题的基础是this链接中的幻灯片#30。我在下面引用它作为参考:

“[PySpark] RDD通常是pickle对象的RDD .Spark SQL(和DataFrames)避免了其中的一些”。

如何在Spark Sql中使用pickle?

1 个答案:

答案 0 :(得分:2)

在最初的Spark RDD模型中,RDD描述了Java对象或pickle 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字符串 - 但只需要满足查询所需的记录,{ {1}}意味着LIMIT,因此只评估和解码几条记录。

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