Spark选项:inferSchema vs header=true

32

参考pyspark: Difference performance for spark.read.format("csv") vs spark.read.csv

我以为需要使用.options("inferSchema" , "true").option("header", "true")才能打印出标题,但实际上我仍然可以打印带有标题的csv文件。

标题和模式有什么区别?我不是很理解“inferSchema:自动推断列类型。它需要对数据进行额外的一次遍历,并且默认值为false”的含义。

2个回答

64

头部和模式是两个不同的东西。

文件头:

如果CSV文件有一个标题行(第一行是列名),则将header=true,这将使用CSV文件中的第一行作为数据帧的列名。将header=false设置为默认选项将导致一个带有默认列名的数据帧:_c0_c1_c2等。

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

模式:

这里提到的模式是指列类型。一列可以是字符串(String)、双精度浮点数(Double)、长整型(Long)等类型。使用inferSchema=false(默认选项)会得到一个所有列都是字符串(StringType)的数据帧。但根据您想要做什么,字符串可能不太好用。例如,如果您想要从不同列中添加数字,则那些列应该是某种数值类型(字符串行不通)。

通过设置inferSchema=true,Spark将自动遍历CSV文件并推断出每列的模式。这需要额外的文件读取,使得使用inferSchema设置为true的文件读取速度较慢。但是,以此换来的是数据帧在大多数情况下将根据其输入具有正确的模式。


作为使用inferSchema读取csv文件的替代方案,您可以在读取时提供模式。这样做的优点是,它比推断模式更快,同时提供具有正确列类型的数据框。此外,在没有标题行的csv文件中,列名可以自动给出。要提供模式,请参见例如:提供模式以将csv文件作为数据框读取

7

在读取CSV文件时,有两种指定模式的方法。

方法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")
  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接