Как выполнять подзапросы в Pyspark без объединения таблиц с помощью API? - PullRequest
0 голосов
/ 08 апреля 2020

Я переписываю некоторый код SQL, и есть часть кода, которая использует подзапросы. Я мог написать это как объединение, но хотел знать, можно ли это сделать аналогичным способом подзапроса в Pyspark. Использование подзапросов в коде SQL дает существенный выигрыш в производительности, но вы хотите знать, будет ли это неактуальным в Pyspark из-за оптимизации в DAG. Поэтому было бы полезно, если бы кто-то мог объяснить относительный компромисс производительности, если есть компромисс.

Лог c довольно прост: у меня есть df_a, и я хочу извлечь столбец из df_b, где df_a и df_b имеют соответствующий индекс для определенного ключа. Ниже не работает, но предназначен, чтобы показать намерение.

df_a.select("df_a.key_1", "df_a.key_2", df_b.select("df_b.key_2").where(col("df_b.key_1")=="df_a.key_3"))

1 Ответ

0 голосов
/ 08 апреля 2020

Если у вас уже есть код sql, который работает, тогда вы можете просто использовать spark.sql(s), где s - ваш запрос в виде строки. Он также может содержать подзапросы. Просто убедитесь, что вы создали представление вашего фрейма данных, чтобы использовать его внутри spark.sql запроса. Вот игрушечный пример:

df.createOrReplaceTempView("people")
sqlDF = spark.sql("SELECT * FROM people") // put your sql query here containing subqueries

Что касается вашего вопроса относительно оптимизации оптимизации. Теоретически оптимизатор катализатора, используемый в spark, должен позаботиться о любой оптимизации в вашем запросе, но, как всегда, если вы точно знаете, какая именно вам нужна оптимизация, в общем, лучше сделать это вручную, а не полагаться на катализатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...