问题描述
我正在读取具有标头的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将启动一个额外的作业水下来完成该任务;您实际上可以看到。这将花费更长的时间,但您不会看到-如您所说-解释的计划中的任何内容。水下就是“水下”。