Spark 选项:inferSchema vs header = true

问题描述 投票:0回答:2

参考 pyspark:spark.read.format("csv") 与 Spark.read.csv 的性能差异

我以为我需要

.options("inferSchema" , "true")
.option("header", "true")
来打印我的标题,但显然我仍然可以打印带有标题的 csv。

标题和模式有什么区别?我不太明白“inferSchema:自动推断列类型。它需要对数据进行一次额外的传递,并且默认情况下为 false”。

csv apache-spark header apache-spark-sql schema
2个回答
67
投票

标题和模式是不同的东西。

标题:

如果 csv 文件有标题(第一行中的列名称),则设置

header=true
。这将使用 csv 文件中的第一行作为数据框的列名称。设置
header=false
(默认选项)将生成具有默认列名称的数据框:
_c0
_c1
_c2
等。

将其设置为 true 或 false 应基于您的输入文件。

架构:

这里指的schema就是列类型。列的类型可以是 String、Double、Long 等。使用

inferSchema=false
(默认选项)将给出一个数据帧,其中所有列都是字符串 (
StringType
)。根据您想要执行的操作,字符串可能不起作用。例如,如果您想添加不同列中的数字,那么这些列应该是某种数字类型(字符串不起作用)。

通过设置

inferSchema=true
,Spark将自动遍历csv文件并推断每列的模式。这需要对文件进行额外的传递,这将导致读取
inferSchema
设置为 true 的文件速度变慢。但作为回报,数据帧很可能在给定输入的情况下具有正确的模式。


作为使用

inferSchema
读取 csv 的替代方法,您可以在读取时提供架构。这样做的优点是“比推断模式更快”,同时提供具有正确列类型的数据帧。此外,对于没有标题行的 csv 文件,可以自动给出列名称。要提供模式,请参阅例如:在将 csv 文件读取为数据帧时提供模式


7
投票

方式1:

指定inferSchema=trueheader=true val myDataFrame = spark.read.options(Map("inferSchema"->"true", "header"->"true")).csv("/path/csv_filename.csv")

注意:

在读取数据时使用这种方法,将会创建一个额外的作业。

方式2:

明确指定模式。 val schema = new StructType() .add("Id",IntegerType,true) .add("Name",StringType,true) .add("Age",IntegerType,true) val myDataFrame = spark.read.option("header", "true") .schema(schema) .csv("/path/csv_filename.csv")

© www.soinside.com 2019 - 2024. All rights reserved.