Проверьте SQL-запрос, сгенерированный Pyspark

Есть ли способ перевести команду PySpark в SQL и проверить ее? Например, чтобы повернуть:

spark.table("this_table").filter(F.col("first_col")>100).select("second_col", "third_col")

в

SELECT second_col, third_col FROM this_table WHERE first_col > 100

Раньше я думаю, что в библиотеке R Sparkly было что-то подобное, но я больше не могу найти эту функцию.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что в PySpark нет прямого способа сделать это, лучшее, что я мог бы придумать, это следующее:

import pandas as pd
import pandas_to_sql
from pyspark.sql import SparkSession
from pyspark.sql.functions import col

spark = SparkSession.builder.getOrCreate()

input_data = [
    (100, 2, 3),
    (200, 4, 5),
    (300, 6, 7),
]
pd_df = spark.createDataFrame(input_data, ["first_col", "second_col", "third_col"]).toPandas()

table_name = "this_table"
df = pandas_to_sql.wrap_df(pd_df, table_name)
df[df["first_col"]>100][["second_col", "third_col"]].get_sql_string()

Выход:

'SELECT (second_col) AS second_col, (third_col) AS third_col FROM this_table WHERE ((first_col > 100)) '

Я знаю, что это не совсем «преобразование» PySpark в SQL. Но если вы знакомы как с PySpark, так и с Pandas, вы можете использовать его в качестве обходного пути для своего варианта использования.

Используемая библиотека — pandas_to_sql. Он не готов к производству и, похоже, не поддерживается активно, поэтому используйте его по своему усмотрению.

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

В противном случае, если вы просто хотите увидеть физический план, а не точный SQL, вы можете использовать explain() следующим образом:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col

spark = SparkSession.builder.getOrCreate()

data = [
    (100, 2, 3),
    (200, 4, 5),
    (300, 6, 7),
]

spark_df = spark.createDataFrame(data, ["first_col", "second_col", "third_col"])
spark_df = spark_df.filter(col("first_col")>100).select("second_col", "third_col")
spark_df.explain()

Выход:

== Physical Plan ==
*(1) Project [second_col#1L, third_col#2L]
+- *(1) Filter (isnotnull(first_col#0L) AND (first_col#0L > 100))
   +- *(1) Scan ExistingRDD[first_col#0L,second_col#1L,third_col#2L]

Теперь, когда я это вижу - мне интересно, можно ли проанализировать физический план и сгенерировать SQL-запрос. Даже если это возможно – конечно, это будет нелегко.

Vikas Sharma 05.04.2024 16:27

Большое спасибо! Разочаровывающе, но очень приятно знать. Я попробую библиотеку panda_to_sql.

Ulysse Colonna 08.04.2024 08:08

Другие вопросы по теме