Spark选项:inferSchema vs header = true

时间:2019-07-08 01:20:36

标签: csv apache-spark header apache-spark-sql schema

引用pyspark: Difference performance for spark.read.format("csv") vs spark.read.csv

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

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

2 个答案:

答案 0 :(得分:3)

标题和架构是分开的东西。

标题:

如果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文件,可以自动指定列名。要提供架构,请参见例如:Provide schema while reading csv file as a dataframe

答案 1 :(得分:0)

我们可以通过两种方式在读取 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")