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

6qqygrtg  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(514)

我正在读取一个csv文件,该文件有一个头,但创建了我的自定义模式来读取。我想知道,如果我提供一个模式与否,在解释中是否有差异。我的好奇心来自于这份关于文件上read.csv的声明
加载csv文件并将结果作为Dataframe返回。如果启用了inferschema,此函数将遍历一次输入以确定输入模式。要避免一次遍历整个数据,请禁用inferschema选项或使用schema显式指定模式。
当我提供模式与使用的模式进行比较时,我可以在提示符中看到时间延迟。但我看不出解释功能有什么不同。下面是我的代码和提供模式的输出

>> 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>

下面是使用InferreSchema选项阅读

>> 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>

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

rxztt3cl

rxztt3cl1#

inferschema=false是默认选项。您将获得所有列作为df的字符串。但是如果你提供一个模式,你就会得到你的输出。
推断出一个模式意味着spark将在水下启动一个额外的工作来完成这个任务;你可以看到事实上。这将需要更长的时间,但你不会看到-正如你所说的-任何解释计划。水下就是“水下”。

相关问题