2017-04-03 7 views
0

ここに私の質問を示す例があります。Spark SQL:PARTITION BYウィンドウ関数のCURRENT ROWを除外

この例では、各ユーザーが購入した他の製品の一覧を収集し、それを新しい列としてトランザクションテーブルに追加します。また、任意の列の「good_bad」をフィルタリングしています。

Spark SQLがPARTITION BYウィンドウ関数のCURRENT ROWを含まないことをサポートしているかどうかを知りたいと思います。

たとえば、トランザクション1は、other_purchases = [prod1, prod2, prod3]ではなく、other_purchases = [prod2, prod3]になります。

df = spark.createDataFrame([ 
    (1, "user1", "prod1", "good"), 
    (2, "user1", "prod2", "good"), 
    (3, "user1", "prod3", "good"), 
    (4, "user2", "prod3", "bad"), 
    (5, "user2", "prod4", "good"), 
    (5, "user2", "prod5", "good")], 
    ("trans_id", "user_id", "prod_id", "good_bad") 
) 
df.show() 

df = df.selectExpr(
    "trans_id", 
    "user_id", 
    "COLLECT_LIST(CASE WHEN good_bad == 'good' THEN prod_id END) OVER(PARTITION BY user_id) AS other_purchases" 
) 
df.show() 

答えて

0

[OK]をクリックして解決策を見つけましたが、それはちょっとばかげています。配列を文字列に連結し、現在の行のprod_idのインスタンスを''に置き換えます。

以下は、わかりやすくするために2つの手順で示しています。

コード:

%pyspark 
df = spark.createDataFrame([ 
    (1, "user1", "prod1", "good"), 
    (2, "user1", "prod2", "good"), 
    (3, "user1", "prod3", "good"), 
    (4, "user2", "prod3", "bad"), 
    (5, "user2", "prod4", "good"), 
    (5, "user2", "prod5", "good")], 
    ("trans_id", "user_id", "prod_id", "good_bad") 
) 
df.show() 

df = df.selectExpr( 
    "trans_id", 
    "user_id", 
    "prod_id", 
    "COLLECT_LIST(CASE WHEN good_bad == 'good' THEN prod_id END) OVER(PARTITION BY user_id) AS other_purchases" 
) 

df = df.selectExpr( 
    "trans_id", 
    "user_id", 
    "prod_id", 
    "other_purchases", 
    "SPLIT(TRIM(REGEXP_REPLACE(CONCAT_WS(' ', other_purchases), prod_id, '')), '[ ]+') AS other_purchases_filtered" 
) 
df.show() 

出力:

+--------+-------+-------+--------+ 
|trans_id|user_id|prod_id|good_bad| 
+--------+-------+-------+--------+ 
|  1| user1| prod1| good| 
|  2| user1| prod2| good| 
|  3| user1| prod3| good| 
|  4| user2| prod3|  bad| 
|  5| user2| prod4| good| 
|  5| user2| prod5| good| 
+--------+-------+-------+--------+ 
+--------+-------+-------+--------------------+------------------------+ 
|trans_id|user_id|prod_id|  other_purchases|other_purchases_filtered| 
+--------+-------+-------+--------------------+------------------------+ 
|  1| user1| prod1|[prod1, prod2, pr...|   [prod2, prod3]| 
|  2| user1| prod2|[prod1, prod2, pr...|   [prod1, prod3]| 
|  3| user1| prod3|[prod1, prod2, pr...|   [prod1, prod2]| 
|  4| user2| prod3|  [prod4, prod5]|   [prod4, prod5]| 
|  5| user2| prod4|  [prod4, prod5]|     [prod5]| 
|  5| user2| prod5|  [prod4, prod5]|     [prod4]| 
+--------+-------+-------+--------------------+------------------------+ 
関連する問題