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

问题描述

我正在读取具有标头的CSV文件,但正在创建要读取的自定义架构。我想了解是否提供模式,但在解释中是否有区别。我对这份关于文档上read.csv的声明的好奇心引起了

加载CSV文件并将结果作为DataFrame返回。 如果启用了inferSchema,则此功能将遍历输入一次以确定输入模式。为避免一次遍历整个数据,请禁用inferSchema选项或使用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,numFriends#11] csv

== Optimized Logical Plan ==
Relation[id#8,numFriends#11] csv

== Physical Plan ==
FileScan csv [id#8,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',inferSchema='true',')
>> 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,friends: int
Relation[userID#32,friends#35] csv

== Optimized Logical Plan ==
Relation[userID#32,friends#35] csv

== Physical Plan ==
FileScan csv [userID#32,friends#35] Batched: false,ReadSchema: struct<userID:int,friends:int>

除了“解析的逻辑”计划中各列的数字发生变化之外,我看不到任何关于一次读取所有数据的解释。

解决方法

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

推断一个模式意味着Spark将启动一个额外的作业水下来完成该任务;您实际上可以看到。这将花费更长的时间,但您不会看到-如您所说-解释的计划中的任何内容。水下就是“水下”。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...