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=true 和 header=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")
参考
我以为我需要 .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=true 和 header=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")