используя оконную функцию sql внутри pyspark - PullRequest
0 голосов
/ 17 октября 2018

У меня есть данные, как пример данных ниже.Я пытаюсь создать новый столбец в моих данных, используя PySpark, который будет категорией первого события для клиента на основе метки времени.Как пример выходных данных ниже.

У меня есть пример ниже того, что я думаю, чтобы сделать это, используя оконную функцию в SQL.

Я довольно новичок в PySpark.Я понимаю, что вы можете запустить SQL внутри PySpark.Мне интересно, если у меня есть правильный код ниже для запуска функции окна sql в PySpark.То есть мне интересно, могу ли я просто вставить sql-код внутри spark.sql, как я сделал ниже.

Ввод:

eventid customerid category timestamp
1       3          a        1/1/12
2       3          b        2/3/14
4       2          c        4/1/12

Ввод:

eventid customerid category timestamp first_event
1       3          a        1/1/12    a
2       3          b        2/3/14    a
4       2          c        4/1/12    c

Пример оконной функции:

select eventid, customerid, category, timestamp 
FIRST_VALUE(catgegory) over(partition by customerid order by timestamp) first_event
from table



# implementing window function example with pyspark

PySpark:
# Note: assume df is dataframe with structure of table above
# (df is table)

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName(“Operations”).getOrCreate()

# Register the DataFrame as a SQL temporary view

df.createOrReplaceView(“Table”)

sql_results = spark.sql(“select eventid, customerid, category, timestamp 
                FIRST_VALUE(catgegory) over(partition by customerid order by                timestamp) first_event
                from table”)

# display results
sql_results.show()

1 Ответ

0 голосов
/ 17 октября 2018

Вы также можете использовать оконную функцию в pyspark

>>> import pyspark.sql.functions as F
>>> from pyspark.sql.window import Window
>>> 
>>> df.show()
+-------+----------+--------+---------+
|eventid|customerid|category|timestamp|
+-------+----------+--------+---------+
|      1|         3|       a|   1/1/12|
|      2|         3|       b|   2/3/14|
|      4|         2|       c|   4/1/12|
+-------+----------+--------+---------+

>>> window = Window.partitionBy('customerid')
>>> df = df.withColumn('first_event', F.first('category').over(window))
>>> 
>>> df.show()
+-------+----------+--------+---------+-----------+                             
|eventid|customerid|category|timestamp|first_event|
+-------+----------+--------+---------+-----------+
|      1|         3|       a|   1/1/12|          a|
|      2|         3|       b|   2/3/14|          a|
|      4|         2|       c|   4/1/12|          c|
+-------+----------+--------+---------+-----------+
...