Как указать условие фильтрации с помощью Spark DataFrameReader API для таблицы? - PullRequest
0 голосов
/ 28 мая 2020

Я читал об искре в документации по модулям данных https://docs.databricks.com/data/tables.html#partition -pruning-1

Там написано

Когда таблица сканируется, Spark нажимает вниз предикаты фильтра, включающие ключи partitionBy. В этом случае Spark избегает чтения данных, которые не удовлетворяют этим предикатам. Например, предположим, что у вас есть таблица, разделенная на разделы <date>. Такой запрос, как SELECT max(id) FROM <example-data> WHERE date = '2010-10-10', читает только файлы данных, содержащие кортежи, значение даты которых совпадает со значением, указанным в запросе.

Как я могу указать такое условие фильтрации в DataFrameReader API при чтении таблицы?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

DataFrameReader создается (доступно) исключительно с использованием SparkSession.read. Это означает, что он создается при выполнении следующего кода (пример загрузки файла csv)

val df = spark.read.csv("path1,path2,path3")

Spark предоставляет подключаемую платформу поставщика данных (API источника данных) для развертывания вашего собственного источника данных. По сути, он предоставляет интерфейсы, которые можно реализовать для чтения / записи в ваш пользовательский источник данных. Вот где обычно реализуются отсечение секций и выталкивание фильтров предикатов.

Databricks Spark поддерживает множество встроенных источников данных (наряду с возможностями предиката выталкивания и сокращения разделов) согласно https://docs.databricks.com/data/data-sources/index.html.

Итак, если необходимо загрузить данные из таблицы JDB C и укажите условия фильтрации, см. следующий пример

// Note: The parentheses are required.
val pushdown_query = "(select * from employees where emp_no < 10008) emp_alias"
val df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, properties=connectionProperties)
display(df)

Подробнее см. здесь https://docs.databricks.com/data/data-sources/sql-databases.html

0 голосов
/ 28 мая 2020

Поскольку искра лениво оценивается, когда вы читаете данные с помощью программы чтения фреймов данных, она просто добавляется как этап в базовый DAG.

Теперь, когда вы запускаете запрос SQL по данным, он также добавляется как еще один этап в DAG.

И когда вы применяете какое-либо действие к фрейму данных, тогда DAG оценивается, и все этапы оптимизируются с помощью Catalyst optimized, что в конечном итоге генерирует наиболее рентабельный физический план.

Во время оценки DAG условия предиката сдвигаются, и в память считываются только необходимые данные.

...