Могут ли все встроенные функции Spark SQL использоваться непосредственно в фрейме данных без выполнения spark.sql(«оператор sql во временном представлении»)?

#pyspark #apache-spark-sql

Вопрос:

Приведенный ниже код работает

 from pyspark.sql.functions import expr
df = spark.createDataFrame([(2020, 6, 26), (1000, 2, 29), (-44, 1, 1)],['Y', 'M', 'D'])
df.select("*",expr("make_date(Y,M,D) as lk")).show()
 

Приведенный ниже код завершается ошибкой с сообщением «не удается импортировать имя ‘make_date’ из ‘pyspark.sql.functions'».

 from pyspark.sql.functions import expr, make_date
df = spark.createDataFrame([(2020, 6, 26), (1000, 2, 29), (-44, 1, 1)],['Y', 'M', 'D'])
df.select(make_date(df.Y,df.M,df.D).alias("datefield")).show()
 

И есть другие функции, такие как сумма, среднее значение и т. Д., Которые Хорошо сочетаются с предложением groupBy фрейма данных .

 df3.groupBy(df3.hair).agg(sum_(df3.age),max_(df3.age)).show()
 

Я здесь в замешательстве. Почему некоторые функции не используются непосредственно со столбцом фрейма данных и только в качестве выражения sql.

Документация spark показывает все функции, выполняемые в виде инструкции sql, а не непосредственно в столбце фрейма данных

https://spark.apache.org/docs/latest/sql-ref-functions-builtin.html

Комментарии:

1. это просто потому, что не каждая функция sql имеет соответствующую реализацию в pyspark

2. @mck Я думаю, что это ответ, который я искал . Таким образом , для работы с кадрами данных не все встроенные функции можно использовать непосредственно в столбце кадра данных . Мы должны использовать выражение sql, чтобы применить его к фрейму данных . Как мы узнаем, какой из них может работать напрямую, а какой нуждается в выражении sql . Есть ли какая-либо документация на это?

3. spark.apache.org/docs/latest/api/sql/index.html и spark.apache.org/docs/3.0.2/api/python/pyspark.sql.html

4. @mck спасибо вам за список .. Но у меня есть вопрос . В этом списке функций ,как мы узнаем , какая из них работает в обоих направлениях, например, функция sum(столбец). Это есть в обоих списках . Каким бы способом мы его ни использовали , либо непосредственно в столбце фрейма данных, либо с помощью выражения sql, имя функции должно быть импортировано из pyspark.sql.functions . Это правильно ?

Ответ №1:

Чтобы правильно использовать функции pyspark, вы должны импортировать их.

 from pyspark.sql.functions import sum, max
 

или

 from pyspark.sql.functions import *
 

Однако в этом случае функции нельзя отличить от собственных функций python, sum и max . Чтобы избежать этого,

 from pyspark.sql import functions as f
 

и используйте функцию pyspark таким образом f.sum , и f.max . Если вы неправильно импортируете функции, функция агрегирования кадров данных также не будет работать.