2017-08-12 7 views
1

ここには、以下の図のようなpysparkデータフレームがあります。私は、グループごとに2行をしたいが、そのようになる:最初の行は第二行は等行2及び3からなり、行1と2と Pyspark - 2行2行1行、2行おき

  • からそのユーザなり

    • このような

    何か:

    ---CustomerID--previous_stockcodes----stock_codes----- 
    

    価格と数量が使用されていない、以前のバスケットとバスケットが一つに入れています。例えば、CustomerID 12347の最初の行は次のようになります。

    12347----[85116, 22375, 71...]-----[84625A, 84625C, ...] 
    

    私はそれを行うには、ループを書かれているが、それは本当に非効率的と遅いです。私はpysparkを使って効率よくそのようなことをすることができるのだろうかと思っていますが、それを理解するのに問題があります。おかげであなたが火花-SQLが提供するlead機能を使って、次の行を得ることができ、事前に多く

  • +0

    を発見していないとき

    default_valueあなたは関係なくはcustomerIdのCustomerIdのか、わずか2行のグループに基づいてGROUPBYしますかケースの入力を取りますか? –

    +0

    私はそれらをトレーニングセットにする必要があります。はい、それはCustomerIDによるものです。たとえば、顧客Aの行1と2、顧客Aの行2と3など – soulless

    答えて

    1

    leadはウィンドウ関数です。

    構文:鉛(column_nameint_valuedefault_value)を超える(COLUMN_NAMEによってCOLUMN_NAME順序によって、パーティション)

    int_valueあなたは、現在の行からリードしたい行数を取ります。大手行が

    >>> input_df.show() 
    +----------+---------+----------------+ 
    |customerID|invoiceNo| stockCode_list| 
    +----------+---------+----------------+ 
    |  12347| 537626| [85116, 22375]| 
    |  12347| 542237|[84625A, 84625C]| 
    |  12347| 549222| [22376, 22374]| 
    |  12347| 556201| [23084, 23162]| 
    |  12348| 539318| [84992, 22951]| 
    |  12348| 541998| [21980, 21985]| 
    |  12348| 548955| [23077, 23078]| 
    +----------+---------+----------------+ 
    
    >>> from pyspark.sql.window import Window 
    >>> from pyspark.sql.functions import lead,col 
    
    >>> win_func = Window.partitionBy("customerID").orderBy("invoiceNo") 
    >>> new_col = lead("stockCode_list",1,None).over(win_func) 
    >>> req_df = input_df.select(col("customerID"),col("invoiceNo"),col("stockCode_list"),new_col.alias("req_col")) 
    >>> req_df.orderBy("customerID","invoiceNo").show() 
    +----------+---------+----------------+----------------+ 
    |customerID|invoiceNo| stockCode_list|   req_col| 
    +----------+---------+----------------+----------------+ 
    |  12347| 537626| [85116, 22375]|[84625A, 84625C]| 
    |  12347| 542237|[84625A, 84625C]| [22376, 22374]| 
    |  12347| 549222| [22376, 22374]| [23084, 23162]| 
    |  12347| 556201| [23084, 23162]|   null| 
    |  12348| 539318| [84992, 22951]| [21980, 21985]| 
    |  12348| 541998| [21980, 21985]| [23077, 23078]| 
    |  12348| 548955| [23077, 23078]|   null| 
    +----------+---------+----------------+----------------+ 
    
    関連する問題