Как работает фильтр спуска вниз с ключами без разделов таблицы Кассандры? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть таблица в Кассандре, где дата не является частью ключа раздела, но является частью ключа кластеризации.При чтении таблицы в спарк я применяю фильтр даты, и он нажимается вниз.Я хочу понять, как работает push down, потому что через cql мы не можем напрямую запрашивать ключ кластеризации.Данные фильтруются где-то?

Реализация на Java:

transactions.filter(transactions.col("timestamp").gt(timestamp))  //column timestamp is of type timestamp

и физический план выглядит как

== Physical Plan == *Project [customer_user_id#67 AS customerUserId#111, cast(timestamp#66 as date) AS date#112, city#70] +- *Filter (isnotnull(timestamp#66) && isnotnull(city#70)) +- *Scan org.apache.spark.sql.cassandra.CassandraSourceRelation@571db8b4 [customer_user_id#67,timestamp#66,city#70] PushedFilters: [IsNotNull(timestamp), *GreaterThan(timestamp,2018-08-13 00:00:00.0), IsNotNull(city)], ReadSchema: struct<customerUserId:int,date:date,city:string>

Также длявременная отметка это работало нормально, но если столбец имеет тип date, то если фильтр не выдвигался, даже если дата была частью ключа раздела.Я должен был написать это как transactions.filter("date >= cast('" + timestamp + "'as date)"), чтобы это работало.(дата столбца имеет тип date)

1 Ответ

0 голосов
/ 28 декабря 2018

Если у вас нет условия для ключа раздела, соединитель Spark Cassandra использует диапазоны токенов для параллельного выполнения эффективного сканирования.Поэтому, если у вас есть условие для некоторого столбца кластеризации clasCol (больше, чем в вашем примере), соединитель сгенерирует следующий запрос (псевдокод, а не реальный код - вы можете найти реальные запросы CQL, если включите ведение журнала отладки):

SELECT col1, col2, ... FROM ks.table WHERE
  token(pk) > :startRange AND token(pk) <= :endRange
  AND clasCol > :your-value ALLOW FILTERING;

Затем Кассандра выполнит сканирование эффективного диапазона для нескольких разделов на одном узле.Вы можете найти код здесь , если хотите узнать больше.

Относительно date - требуется больше заглядывать в код, но, возможно, просто отсутствует какое-то преобразование типов или что-то в этом роде - вы можете проверить, какие запросы были сгенерированы для обоих случаев.

...