PySpark如何在SparkSql和数据帧中使用pickle

PySpark如何在SparkSql和数据帧中使用pickle,pyspark,spark-dataframe,pickle,pyspark-sql,Pyspark,Spark Dataframe,Pickle,Pyspark Sql,我试图理解PySpark如何将pickle用于RDD,并避免将其用于SparkSql和数据帧。问题的基础来自链接中的幻灯片#30。我在下面引用它以供参考: “[PySpark]RDD通常是经过pickle处理的对象的RDD。Spark SQL(和数据帧)可以避免这种情况。” pickle是如何在Spark Sql中使用的?在最初的Spark RDD模型中,RDD描述了Java对象或pickle Python对象的分布式集合。但是,SparkSQL“dataframes”(包括Dataset)表示

我试图理解PySpark如何将pickle用于RDD,并避免将其用于SparkSql和数据帧。问题的基础来自链接中的幻灯片#30。我在下面引用它以供参考:

“[PySpark]RDD通常是经过pickle处理的对象的RDD。Spark SQL(和数据帧)可以避免这种情况。”


pickle是如何在Spark Sql中使用的?

在最初的Spark RDD模型中,RDD描述了Java对象或pickle Python对象的分布式集合。但是,SparkSQL“dataframes”(包括Dataset)表示针对一个或多个源/父级的查询

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

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

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

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

或者,如果我们从PySpark中执行了
spark.read.text(“…”).show()
,那么spark将需要将一些记录转换为Python字符串——但只转换为满足查询所需的记录,
show()
意味着一个限制,因此只有少数记录被计算和“解码”


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

谢谢Adam。编码器的过帐参考