为什么将 schema 指定为 DateType / TimestampType 会使查询变得非常慢?
Why specifying schema to be DateType / TimestampType will make querying extremely slow?
我正在使用 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
)的两行之后,查询变得更快。
这可能是什么原因?非常感谢!
我们已经找到了这个问题的可能答案。
当简单地指定一个列为DateType
或TimestampType
时,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
)的两行之后,查询变得更快。
这可能是什么原因?非常感谢!
我们已经找到了这个问题的可能答案。
当简单地指定一个列为DateType
或TimestampType
时,spark-csv会尝试为该行的每一行解析日期及其所有内部格式,这使得解析进度慢得多。
从它的官方文档来看,我们似乎可以在选项中指定日期的格式。我想它可以使解析进度更快。