簡體   English   中英

在pyspark中,如何通過一列數據框循環過濾功能?

[英]In pyspark, how to loop filter function through a column of data frame?

這是我的數據:

**name** **movie**
jason        a
jason        b
jason        c
mike         a
mike         b
bruce        a
bruce        c
ryan         b

我的目標是做到這一點

**name** **# of moive**
jason       a,b,c
mike         a,b
bruce        a,c
ryan          b

我正在使用pyspark並嘗試使用UDF來完成這個工作人員。 我定義了這個函數並且spark給了我一個錯誤,因為它調用了基本函數'filter',這使得啟動一個新工作者出現了問題(如果沒有,請糾正我)。

我的邏輯是首先使用過濾器來制作子集,然后行數就是電影的數量。 在此之后,我使用此UDF創建了一個新列。

def udf(user_name):
    return df.filter(df['name'] == user_name).select('movie').dropDuplictes()\
                                    .toPandas['movie'].tolist()

df.withColumn('movie_number', udf(df['name']))

但它不起作用。 有沒有辦法用基本的火花功能制作UDF?

所以我將名稱列放入列表並循環遍歷列表,但它超級慢我相信這樣我沒有做分布式計算。

1)我的優先級是要弄清楚通過信息如何循環與基本功能,如數據幀pyspark的一列spark_df.filter

2)我們可以先將名稱列放入RDD,然后使用我的UDF循環遍歷該RDD,那么可以利用分布式計算嗎?

3)如果我有2個具有相同結構(名稱/電影)的表,但是對於不同年份,如2005年和2007年,我們可以有效地制作第三個表,其結構如下:

**name** **movie** **in_2005** **in_2007** 
jason        a          1           0
jason        b          0           1
jason        c          1           1
mike         a          0           1
mike         b          1           0
bruce        a          0           0
bruce        c          1           1
ryan         b          1           0

1和0表示該人是否在2005/2007年對該電影發表評論。 在這種情況下,原始表將是:

2005年:

**name** **movie**
jason        a
jason        c
mike         b
bruce        c
ryan         b

2007年

**name** **movie**
jason        b
jason        c
mike         a
bruce        c

我的想法是將2個表與“年”列連在一起,並使用數據透視表來獲得所需的結構。

我建議使用groupby跟隨collect_list而不是將整個數據幀轉換為RDD。 您可以在之后應用UDF。

import pyspark.sql.functions as func

# toy example dataframe
ls = [
    ['jason', 'movie_1'],
    ['jason', 'movie_2'],
    ['jason', 'movie_3'],
    ['mike', 'movie_1'],
    ['mike', 'movie_2'],
    ['bruce', 'movie_1'],
    ['bruce', 'movie_3'],
    ['ryan', 'movie_2']
]
df = spark.createDataFrame(pd.DataFrame(ls, columns=['name', 'movie']))

df_movie = df.groupby('name').agg(func.collect_list(func.col('movie')))

現在,這是創建udf來處理新列movies的示例。 我只是舉例說明如何計算每一行的長度。

def movie_len(movies):
    return len(movies)
udf_movie_len = func.udf(movie_len, returnType=StringType())

df_movie.select('name', 'movies', udf_movie_len(func.col('movies')).alias('n_movies')).show()

這將給出:

+-----+--------------------+--------+
| name|              movies|n_movies|
+-----+--------------------+--------+
|jason|[movie_1, movie_2...|       3|
| ryan|           [movie_2]|       1|
|bruce|  [movie_1, movie_3]|       2|
| mike|  [movie_1, movie_2]|       2|
+-----+--------------------+--------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM