Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/source/user-guide/latest/configs.md
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ These settings can be used to determine which parts of the plan are accelerated
| `spark.comet.expression.Reverse.enabled` | Enable Comet acceleration for `Reverse` | true |
| `spark.comet.expression.Round.enabled` | Enable Comet acceleration for `Round` | true |
| `spark.comet.expression.Second.enabled` | Enable Comet acceleration for `Second` | true |
| `spark.comet.expression.Sha1.enabled` | Enable Comet acceleration for `Sha1` | true |
| `spark.comet.expression.Sha2.enabled` | Enable Comet acceleration for `Sha2` | true |
| `spark.comet.expression.ShiftLeft.enabled` | Enable Comet acceleration for `ShiftLeft` | true |
| `spark.comet.expression.ShiftRight.enabled` | Enable Comet acceleration for `ShiftRight` | true |
Expand Down
16 changes: 8 additions & 8 deletions fuzz-testing/src/main/scala/org/apache/comet/fuzz/Main.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import org.rogach.scallop.ScallopOption

import org.apache.spark.sql.SparkSession

import org.apache.comet.testing.{DataGenOptions, ParquetGenerator}
import org.apache.comet.testing.{DataGenOptions, ParquetGenerator, SchemaGenOptions}

class Conf(arguments: Seq[String]) extends ScallopConf(arguments) {
object generateData extends Subcommand("data") {
Expand Down Expand Up @@ -78,19 +78,19 @@ object Main {
case Some(seed) => new Random(seed)
case None => new Random()
}
val options = DataGenOptions(
allowNull = true,
generateArray = conf.generateData.generateArrays(),
generateStruct = conf.generateData.generateStructs(),
generateMap = conf.generateData.generateMaps(),
generateNegativeZero = !conf.generateData.excludeNegativeZero())
for (i <- 0 until conf.generateData.numFiles()) {
ParquetGenerator.makeParquetFile(
r,
spark,
s"test$i.parquet",
numRows = conf.generateData.numRows(),
options)
SchemaGenOptions(
generateArray = conf.generateData.generateArrays(),
generateStruct = conf.generateData.generateStructs(),
generateMap = conf.generateData.generateMaps()),
DataGenOptions(
allowNull = true,
generateNegativeZero = !conf.generateData.excludeNegativeZero()))
}
case Some(conf.generateQueries) =>
val r = conf.generateQueries.randomSeed.toOption match {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,50 +44,16 @@ object FuzzDataGenerator {
val defaultBaseDate: Long =
new SimpleDateFormat("YYYY-MM-DD hh:mm:ss").parse("3333-05-25 12:34:56").getTime

private val primitiveTypes = Seq(
DataTypes.BooleanType,
DataTypes.ByteType,
DataTypes.ShortType,
DataTypes.IntegerType,
DataTypes.LongType,
DataTypes.FloatType,
DataTypes.DoubleType,
DataTypes.createDecimalType(10, 2),
DataTypes.createDecimalType(36, 18),
DataTypes.DateType,
DataTypes.TimestampType,
DataTypes.TimestampNTZType,
DataTypes.StringType,
DataTypes.BinaryType)

private def filteredPrimitives(excludeTypes: Seq[DataType]) = {

primitiveTypes.filterNot { dataType =>
excludeTypes.exists {
case _: DecimalType =>
// For DecimalType, match if the type is also a DecimalType (ignore precision/scale)
dataType.isInstanceOf[DecimalType]
case excludeType =>
dataType == excludeType
}
}
}

def generateDataFrame(
r: Random,
spark: SparkSession,
numRows: Int,
options: DataGenOptions): DataFrame = {

val filteredPrimitiveTypes = filteredPrimitives(options.excludeTypes)
def generateSchema(options: SchemaGenOptions): StructType = {
val primitiveTypes = options.primitiveTypes
val dataTypes = ListBuffer[DataType]()
dataTypes.appendAll(filteredPrimitiveTypes)
dataTypes.appendAll(primitiveTypes)

val arraysOfPrimitives = filteredPrimitiveTypes.map(DataTypes.createArrayType)
val arraysOfPrimitives = primitiveTypes.map(DataTypes.createArrayType)

if (options.generateStruct) {
dataTypes += StructType(filteredPrimitiveTypes.zipWithIndex.map(x =>
StructField(s"c${x._2}", x._1, nullable = true)))
dataTypes += StructType(
primitiveTypes.zipWithIndex.map(x => StructField(s"c${x._2}", x._1, nullable = true)))

if (options.generateArray) {
dataTypes += StructType(arraysOfPrimitives.zipWithIndex.map(x =>
Expand All @@ -103,9 +69,8 @@ object FuzzDataGenerator {
dataTypes.appendAll(arraysOfPrimitives)

if (options.generateStruct) {
dataTypes += DataTypes.createArrayType(
StructType(filteredPrimitiveTypes.zipWithIndex.map(x =>
StructField(s"c${x._2}", x._1, nullable = true))))
dataTypes += DataTypes.createArrayType(StructType(primitiveTypes.zipWithIndex.map(x =>
StructField(s"c${x._2}", x._1, nullable = true))))
}

if (options.generateMap) {
Expand All @@ -117,7 +82,15 @@ object FuzzDataGenerator {
// generate schema using random data types
val fields = dataTypes.zipWithIndex
.map(i => StructField(s"c${i._2}", i._1, nullable = true))
val schema = StructType(fields.toSeq)
StructType(fields.toSeq)
}

def generateDataFrame(
r: Random,
spark: SparkSession,
schema: StructType,
numRows: Int,
options: DataGenOptions): DataFrame = {

// generate columnar data
val cols: Seq[Seq[Any]] =
Expand Down Expand Up @@ -247,11 +220,31 @@ object FuzzDataGenerator {
}
}

case class DataGenOptions(
allowNull: Boolean = true,
generateNegativeZero: Boolean = true,
baseDate: Long = FuzzDataGenerator.defaultBaseDate,
object SchemaGenOptions {
val defaultPrimitiveTypes: Seq[DataType] = Seq(
DataTypes.BooleanType,
DataTypes.ByteType,
DataTypes.ShortType,
DataTypes.IntegerType,
DataTypes.LongType,
DataTypes.FloatType,
DataTypes.DoubleType,
DataTypes.createDecimalType(10, 2),
DataTypes.createDecimalType(36, 18),
DataTypes.DateType,
DataTypes.TimestampType,
DataTypes.TimestampNTZType,
DataTypes.StringType,
DataTypes.BinaryType)
}

case class SchemaGenOptions(
generateArray: Boolean = false,
generateStruct: Boolean = false,
generateMap: Boolean = false,
excludeTypes: Seq[DataType] = Seq.empty)
primitiveTypes: Seq[DataType] = SchemaGenOptions.defaultPrimitiveTypes)

case class DataGenOptions(
allowNull: Boolean = true,
generateNegativeZero: Boolean = true,
baseDate: Long = FuzzDataGenerator.defaultBaseDate)
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,32 @@ package org.apache.comet.testing
import scala.util.Random

import org.apache.spark.sql.{SaveMode, SparkSession}
import org.apache.spark.sql.types.StructType

object ParquetGenerator {

/** Generate a Parquet file using a generated schema */
def makeParquetFile(
r: Random,
spark: SparkSession,
filename: String,
numRows: Int,
options: DataGenOptions): Unit = {

val df = FuzzDataGenerator.generateDataFrame(r, spark, numRows, options)
schemaGenOptions: SchemaGenOptions,
dataGenOptions: DataGenOptions): Unit = {
val schema = FuzzDataGenerator.generateSchema(schemaGenOptions)
makeParquetFile(r, spark, filename, schema, numRows, dataGenOptions)
}

/** Generate a Parquet file using the provided schema */
def makeParquetFile(
r: Random,
spark: SparkSession,
filename: String,
schema: StructType,
numRows: Int,
options: DataGenOptions): Unit = {
val df = FuzzDataGenerator.generateDataFrame(r, spark, schema, numRows, options)
df.write.mode(SaveMode.Overwrite).parquet(filename)
}

}
106 changes: 41 additions & 65 deletions spark/src/test/scala/org/apache/comet/CometArrayExpressionSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import org.apache.spark.sql.functions._
import org.apache.comet.CometSparkSessionExtensions.{isSpark35Plus, isSpark40Plus}
import org.apache.comet.DataTypeSupport.isComplexType
import org.apache.comet.serde.{CometArrayExcept, CometArrayRemove, CometArrayReverse, CometFlatten}
import org.apache.comet.testing.{DataGenOptions, ParquetGenerator}
import org.apache.comet.testing.{DataGenOptions, ParquetGenerator, SchemaGenOptions}

class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelper {

Expand Down Expand Up @@ -64,12 +64,8 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
spark,
filename,
100,
DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = false,
generateStruct = false,
generateMap = false))
SchemaGenOptions(generateArray = false, generateStruct = false, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
val table = spark.read.parquet(filename)
table.createOrReplaceTempView("t1")
Expand All @@ -95,13 +91,13 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
val filename = path.toString
val random = new Random(42)
withSQLConf(CometConf.COMET_ENABLED.key -> "false") {
val options = DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = true,
generateStruct = true,
generateMap = false)
ParquetGenerator.makeParquetFile(random, spark, filename, 100, options)
ParquetGenerator.makeParquetFile(
random,
spark,
filename,
100,
SchemaGenOptions(generateArray = true, generateStruct = true, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
withSQLConf(
CometConf.COMET_NATIVE_SCAN_ENABLED.key -> "false",
Expand Down Expand Up @@ -266,12 +262,8 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
spark,
filename,
100,
DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = true,
generateStruct = true,
generateMap = false))
SchemaGenOptions(generateArray = true, generateStruct = true, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
val table = spark.read.parquet(filename)
table.createOrReplaceTempView("t1")
Expand Down Expand Up @@ -310,12 +302,8 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
spark,
filename,
100,
DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = false,
generateStruct = false,
generateMap = false))
SchemaGenOptions(generateArray = false, generateStruct = false, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
val table = spark.read.parquet(filename)
table.createOrReplaceTempView("t2")
Expand All @@ -340,12 +328,8 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
spark,
filename,
100,
DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = true,
generateStruct = true,
generateMap = false))
SchemaGenOptions(generateArray = true, generateStruct = true, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
withSQLConf(
CometConf.COMET_NATIVE_SCAN_ENABLED.key -> "false",
Expand Down Expand Up @@ -588,12 +572,8 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
spark,
filename,
100,
DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = false,
generateStruct = false,
generateMap = false))
SchemaGenOptions(generateArray = false, generateStruct = false, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
withSQLConf(CometConf.COMET_EXPR_ALLOW_INCOMPATIBLE.key -> "true") {
withTempView("t1", "t2") {
Expand Down Expand Up @@ -622,13 +602,13 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
val filename = path.toString
val random = new Random(42)
withSQLConf(CometConf.COMET_ENABLED.key -> "false") {
val options = DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = true,
generateStruct = true,
generateMap = false)
ParquetGenerator.makeParquetFile(random, spark, filename, 100, options)
ParquetGenerator.makeParquetFile(
random,
spark,
filename,
100,
SchemaGenOptions(generateArray = true, generateStruct = true, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
withSQLConf(
CometConf.COMET_NATIVE_SCAN_ENABLED.key -> "false",
Expand Down Expand Up @@ -692,12 +672,8 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
spark,
filename,
100,
DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = false,
generateStruct = false,
generateMap = false))
SchemaGenOptions(generateArray = false, generateStruct = false, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
val table = spark.read.parquet(filename)
table.createOrReplaceTempView("t1")
Expand All @@ -720,13 +696,13 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
val filename = path.toString
val random = new Random(42)
withSQLConf(CometConf.COMET_ENABLED.key -> "false") {
val options = DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = true,
generateStruct = true,
generateMap = false)
ParquetGenerator.makeParquetFile(random, spark, filename, 100, options)
ParquetGenerator.makeParquetFile(
random,
spark,
filename,
100,
SchemaGenOptions(generateArray = true, generateStruct = true, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
withSQLConf(
CometConf.COMET_NATIVE_SCAN_ENABLED.key -> "false",
Expand Down Expand Up @@ -773,13 +749,13 @@ class CometArrayExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelp
val filename = path.toString
val random = new Random(42)
withSQLConf(CometConf.COMET_ENABLED.key -> "false") {
val options = DataGenOptions(
allowNull = true,
generateNegativeZero = true,
generateArray = true,
generateStruct = true,
generateMap = false)
ParquetGenerator.makeParquetFile(random, spark, filename, 100, options)
ParquetGenerator.makeParquetFile(
random,
spark,
filename,
100,
SchemaGenOptions(generateArray = true, generateStruct = true, generateMap = false),
DataGenOptions(allowNull = true, generateNegativeZero = true))
}
withSQLConf(
CometConf.COMET_NATIVE_SCAN_ENABLED.key -> "false",
Expand Down
Loading
Loading