Я использую spark-redshift для чтения данных из кластера Redshift. Пример кода:
spark.read
.format("com.databricks.spark.redshift")
.option("url", s"$redshiftUrl/$redshiftDatabase")
.option("user", redshiftUsername)
.option("password", redshiftPassword)
.option("tempdir", s"s3a://$redshiftTempBucket")
.option("driver", redshiftDriver)
.option("tempformat", "CSV GZIP")
.option("aws_iam_role", redshiftAwsIamRole)
.option("dbtable", s"${table.schema}.${table.name}")
.load()
.filter(col("SOME_COLUMN_TO_FILTER_BY") === lit(23))
Расширенный физический план выглядит следующим образом:
== Physical Plan ==
InMemoryTableScan [columns..., ... 45 more fields]
+- InMemoryRelation [columns..., ... 45 more fields], StorageLevel(disk, memory, deserialized, 1 replicas)
+- *(1) Filter (cast(SOME_COLUMN_TO_FILTER_BY#7022 as bigint) = 23)
+- *(1) Scan RedshiftRelation(${table.schema}.${table.name}) [columns...,... 45 more fields] PushedFilters: [*IsNotNull(SOME_COLUMN_TO_FILTER_BY)], ReadSchema: struct<...>
Итак, как вы можете видеть в PressedFilters, у нас есть только проверка на IsNotNull и отсутствие равенства 23: PushedFilters: [*IsNotNull(SOME_COLUMN_TO_FILTER_BY)]
В результате запрос, который Redshift использует для выгрузки данных в S3:
SELECT columns... FROM "schema"."table" WHERE "SOME_COLUMN_TO_FILTER_BY" IS NOT NULL
Мой вопрос: почему равенство 23 не было перенесено на запрос, который Redshift использует для выгрузки данных до S3?