Saya memiliki cuplikan tabel ini yang disebut joinTbl:

PRODUCT_ID  PRODUCT_NAME    ORDER_ID     PRODUCT_ID      CUSTOMER_ID     SALESPERSON_ID      UNIT_PRICE 
   11          CAKE           10946          11               83              1                  31
   11          CAKE           10949          11               10              2                  31
   11          CAKE           11020          11               56              2                  31
   14          CHICKEN        11076          14               9               4                  23.25
   11          CAKE           11077          11               65              1                  31
   14          CHICKEN        11077          14               65              1                  23.25

Di Pig Apache, saya mencoba untuk mendapatkan ORDER_ID jika pesanannya terdiri dari kue dan ayam. Hasil yang diharapkan adalah

11077

Namun saya menghadapi masalah saat mencoba melakukan bicond untuk mendapatkan ORDER_ID ini. Ini adalah sintaks yang saya gunakan:

cakeChicken = FOREACH joinedTbl GENERATE ((PRODUCT_NAME == 'CAKE' AND PRODUCT_NAME == 'CHICKEN') ? ORDER_ID : 0) AS order_both;

Pengembalian dari ini hanya 0 yang merupakan pernyataan else.

Apa yang saya lakukan salah?

1
datanewbie96 23 Mei 2021, 15:58

1 menjawab

Jawaban Terbaik

Bincond Anda berfungsi dengan benar - karena berada dalam FOREACH, bincond akan memeriksa setiap baris data satu per satu. Oleh karena itu, setiap baris hanya akan memiliki satu nilai untuk PRODUCT_NAME, sehingga tidak dapat menjadi 'CAKE' dan 'CHICKEN'.

Berdasarkan apa yang ingin Anda lakukan, saya akan menggunakan GROUP BY untuk mengelompokkan di ORDER_ID lalu filter< /a> tas PRODUCT_NAME hanya untuk yang berisi 'CAKE' dan 'CHICKEN' menggunakan foreach bersarang. Terakhir, filter data ke kantong "tidak kosong". Sesuatu seperti ini:

groupedData = GROUP  joinTbl BY ORDER_ID;

/* Structure:
---------------------------------------------------------------------------------------------------------------------------------
| groupedData | group | joinTbl: bag({PRODUCT_ID, PRODUCT_NAME, ORDER_ID, PRODUCT_ID, CUSTOMER_ID, SALESPERSON_ID, UNIT_PRICE}) |
---------------------------------------------------------------------------------------------------------------------------------
|             | 10946 | {(11, CAKE, 10946, 11, 83, 1, 31)}                                                                      |
|             | 11077 | {(11, CAKE, 11077, 11, 65, 1, 31), (14, CHICKEN,  11077, 14, 65, 1, 23.25)}                             |
---------------------------------------------------------------------------------------------------------------------------------
*/

cakeChickenIds = FOREACH groupedData {
    cakes = FILTER joinTbl BY PRODUCT_NAME == 'CAKE';
    chickens = FILTER joinTbl BY PRODUCT_NAME == 'CHICKEN';
    GENERATE group AS ORDER_ID,
    cakes,
    chickens;
}

/* Structure:
------------------------------------------------------------------------------------------
| cakeChickenIds | ORDER_ID | cakes: bag({PRODUCT_NAME}) | chickens: bag({PRODUCT_NAME}) |
------------------------------------------------------------------------------------------
|                | 10946    | {(CAKE)}                   | {()}                          |
|                | 11077    | {(CAKE)}                   | {(CHICKEN)}                   |
------------------------------------------------------------------------------------------
*/

-- Both cakes and chickens bags will not be empty if ordered both
cakeChickenOrders = FILTER cakeChickenIds BY NOT IsEmpty(cakes) AND NOT IsEmpty(chickens);
0
pauljcg 24 Mei 2021, 17:47