Spark 选项:inferSchema 与 header = true

Spark Option: inferSchema vs header = true

参考

我以为我需要 .options("inferSchema" , "true").option("header", "true") 来打印我的 headers 但显然我仍然可以用 headers 打印我的 csv。

header 和 schema 有什么区别?我不太明白"inferSchema: automatically infers column types. It requires one extra pass over the data and is false by default".

的意思

header 和模式是不同的东西。

Header:

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

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

架构:

这里指的模式是列类型。列可以是 String、Double、Long 等类型。使用 inferSchema=false(默认选项)将提供一个数据框,其中所有列都是字符串 (StringType)。根据您想要执行的操作,字符串可能不起作用。例如,如果您想添加来自不同列的数字,那么这些列应该是某种数字类型(字符串不起作用)。

通过设置inferSchema=true,Spark 将自动遍历csv 文件并推断每一列的架构。这需要额外传递文件,这将导致读取 inferSchema 设置为 true 的文件变慢。但是在 return 中,数据框很可能在给定输入的情况下具有正确的模式。


作为使用 inferSchema 读取 csv 的替代方法,您可以在读取时提供架构。这样做的优点是 比推断架构 更快,同时提供具有正确列类型的数据框。此外,对于没有 header 行的 csv 文件,可以自动给出列名。要提供架构,请参见例如:Provide schema while reading csv file as a dataframe

我们可以通过两种方式在读取 csv 文件时指定架构。

Way1: 指定 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")