[英]How to iterate through rows of a column of a unknown data-frame in 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.