为什么将模式指定为DateType / TimestampType会使查询速度极慢?

时间:2016-01-21 03:17:44

标签: apache-spark spark-csv

我正在使用spark-csv 1.1.0和Spark 1.5。我按如下方式制作模式:

private def makeSchema(tableColumns: List[SparkSQLFieldConfig]): StructType = {
    new StructType(
      tableColumns.map(p => p.ColumnDataType match {
        case FieldDataType.Integer => StructField(p.ColumnName, IntegerType, nullable = true)
        case FieldDataType.Decimal => StructField(p.ColumnName, FloatType, nullable = true)
        case FieldDataType.String => StructField(p.ColumnName, StringType, nullable = true)
        case FieldDataType.DateTime => StructField(p.ColumnName, TimestampType, nullable = true)
        case FieldDataType.Date => StructField(p.ColumnName, DateType, nullable = true)
        case FieldDataType.Boolean => StructField(p.ColumnName, BooleanType, nullable = false)
        case _ => StructField(p.ColumnName, StringType, nullable = true)
      }).toArray
    )
  }

但是当有DateType列时,我对Dataframes的查询会非常慢。 (查询只是简单的groupby(), sum()等等)

使用相同的数据集,在我评论两行以将Date映射到DateType并将DateTime映射到TimestampType(即将它们映射到StringType)之后,查询变得多了更快。

可能的原因是什么?非常感谢你!

1 个答案:

答案 0 :(得分:1)

我们找到了解决此问题的可能答案。

当简单地将列指定为DateTypeTimestampType时,spark-csv将尝试使用行的每一行的所有内部格式来解析日期,这使得解析进度慢得多

从官方文档中,我们似乎可以在选项中指定日期的格式。我想它可以使解析进度更快。