Pyspark 解释了使用和不使用自定义模式来读取 csv 的区别

Posted

技术标签:

【中文标题】Pyspark 解释了使用和不使用自定义模式来读取 csv 的区别【英文标题】:Pyspark explain difference with and without custom schema for reading csv 【发布时间】:2021-02-20 11:09:14 【问题描述】:

我正在读取一个 CSV 文件,该文件有一个标题,但创建了我的自定义架构来读取。如果我提供模式,我想了解解释中是否存在差异。我对文档上关于 read.csv 的声明引起了我的好奇心

加载 CSV 文件并将结果作为 DataFrame 返回。 如果启用了 inferSchema,此函数将遍历输入一次以确定输入模式。为避免一次性遍历整个数据,请禁用 inferSchema 选项或使用 schema 显式指定 schema。

与使用的 inferSchema 相比,当我提供架构时,我可以在提示中看到时间延迟。但我看不出解释功能有什么不同。以下是我的代码和提供架构的输出

>> friends_header_df = spark.read.csv(path='resources/fakefriends-header.csv',schema=custom_schems, header='true', sep=',')
>> print(friends_header_df._jdf.queryExecution().toString())
== Parsed Logical Plan ==
Relation[id#8,name#9,age#10,numFriends#11] csv

== Analyzed Logical Plan ==
id: int, name: string, age: int, numFriends: int
Relation[id#8,name#9,age#10,numFriends#11] csv

== Optimized Logical Plan ==
Relation[id#8,name#9,age#10,numFriends#11] csv

== Physical Plan ==
FileScan csv [id#8,name#9,age#10,numFriends#11] Batched: false, DataFilters: [], Format: CSV, Location: InMemoryFileIndex[file:/Users/sgudisa/Desktop/python data analysis workbook/spark-workbook/resour..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<id:int,name:string,age:int,numFriends:int>

下面是使用 inferSchema 选项阅读

>> friends_noschema_df = spark.read.csv(path='resources/fakefriends-header.csv',header='true',inferSchema='true',sep=',')
>> print(friends_noschema_df._jdf.queryExecution().toString())
== Parsed Logical Plan ==
Relation[userID#32,name#33,age#34,friends#35] csv

== Analyzed Logical Plan ==
userID: int, name: string, age: int, friends: int
Relation[userID#32,name#33,age#34,friends#35] csv

== Optimized Logical Plan ==
Relation[userID#32,name#33,age#34,friends#35] csv

== Physical Plan ==
FileScan csv [userID#32,name#33,age#34,friends#35] Batched: false, DataFilters: [], Format: CSV, Location: InMemoryFileIndex[file:/Users/sgudisa/Desktop/python data analysis workbook/spark-workbook/resour..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<userID:int,name:string,age:int,friends:int>

除了 Parsed Logical 计划中列的数字发生变化外,我没有看到任何关于 spark 读取所有数据一次的解释。

【问题讨论】:

有什么理由不接受答案? 【参考方案1】:

InferSchema = false 是默认选项。您将获得所有列作为 DF 的字符串。但是,如果您提供架构,您就会得到输出。

推断架构意味着 Spark 将启动一个额外的工作 underwater 来做到这一点;事实上,你可以看到。这将需要更长的时间,但您不会看到 - 正如您所说的 - 解释计划中的任何内容。水下就是“水下”。

【讨论】:

以上是关于Pyspark 解释了使用和不使用自定义模式来读取 csv 的区别的主要内容,如果未能解决你的问题,请参考以下文章

使用冰山表格式将自定义元数据添加到 DataFrame 模式

使用 pyspark 读取多个 csv 文件

DSX PySpark 使用自定义 JDBC 方言将数据写入 dashDB

如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?

如何从 PySpark 中的数据框中获取模式定义?

自定义模块中的函数在 PySpark 中不起作用,但在交互模式下输入时它们起作用