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 模式
DSX PySpark 使用自定义 JDBC 方言将数据写入 dashDB