Advertisement
tills

gendata

May 2nd, 2025
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 4.30 KB | None | 0 0
  1. import org.apache.spark.sql.{DataFrame, SparkSession}
  2. import org.apache.spark.sql.functions._
  3. import org.apache.spark.sql.types._
  4.  
  5. /**
  6.  * Klasa generująca dane testowe dla ShopEligibility
  7.  */
  8. class ShopEligibilityTestDataGenerator(spark: SparkSession) {
  9.   import spark.implicits._
  10.  
  11.   // Stałe dla naszych testów
  12.   val SHOP_GOOD = "SHOP001" // Sklep spełniający wszystkie kryteria
  13.   val SHOP_BAD = "SHOP002"  // Sklep naruszający wszystkie reguły
  14.  
  15.   // Miesiące testowe (ostatnie 4 miesiące)
  16.   val MONTHS = Array(202101, 202102, 202103, 202104)
  17.  
  18.   /**
  19.    * Generowanie tabeli lrx_panel
  20.    */
  21.   def generatePanelData(): DataFrame = {
  22.     val data = Seq(
  23.       (SHOP_GOOD),
  24.       (SHOP_BAD)
  25.     )
  26.    
  27.     spark.createDataFrame(data.map(Tuple1.apply)).toDF("shop_id")
  28.   }
  29.  
  30.   /**
  31.    * Generowanie tabeli dim_pack
  32.    */
  33.   def generateDimPackData(): DataFrame = {
  34.     val data = Seq(
  35.       // Leki na receptę
  36.       ("PACK001", "RX", 20210101, 20211231),
  37.       ("PACK002", "RX", 20210101, 20211231),
  38.       ("PACK003", "RX", 20210101, 20211231),
  39.       // Leki bez recepty
  40.       ("PACK004", "OTC", 20210101, 20211231),
  41.       ("PACK005", "OTC", 20210101, 20211231)
  42.     )
  43.    
  44.     spark.createDataFrame(data).toDF("pack_id", "basket_4_code", "day_id_from", "day_id_to")
  45.   }
  46.  
  47.   /**
  48.    * Generowanie tabeli lrx_sales
  49.    */
  50.   def generateSalesData(): DataFrame = {
  51.     // Dla dobrego sklepu - dużo transakcji, dużo pacjentów, stabilne wartości RX
  52.     val goodShopData = (for {
  53.       month <- MONTHS
  54.       // 30 pacjentów na miesiąc
  55.       patientId <- 1 to 30
  56.       // 2 transakcje na pacjenta
  57.       trnOffset <- 0 to 1
  58.       // 2 rodzaje paczek na transakcję (1 na receptę, 1 bez)
  59.       packIds = if (trnOffset == 0) Seq("PACK001", "PACK004") else Seq("PACK002", "PACK005")
  60.       packId <- packIds
  61.      
  62.       // Dzień w miesiącu
  63.       day = month * 100 + 15
  64.      
  65.       // ID transakcji
  66.       trnId = s"TRN_${month}_${patientId}_${trnOffset}"
  67.      
  68.       // ID przepisującego (tylko dla RX)
  69.       prescriberId = if (packId.startsWith("PACK00") && packId.endsWith("1") || packId.endsWith("2") || packId.endsWith("3"))
  70.                       Some(s"DOC_${patientId % 10 + 1}") else None
  71.     } yield {
  72.       (SHOP_GOOD, month, s"PAT_$patientId", trnId, packId, day, prescriberId.orNull)
  73.     }).toSeq
  74.    
  75.     // Dla złego sklepu - mało transakcji, mało pacjentów, duże wahania RX
  76.     val badShopData = (for {
  77.       month <- MONTHS
  78.       // Zmienna liczba pacjentów (tylko 10 w ostatnim miesiącu, ale rosnąca w czasie)
  79.       patientMax = month match {
  80.         case 202101 => 40  // Dużo w pierwszym miesiącu
  81.         case 202102 => 5   // Gwałtowny spadek
  82.         case 202103 => 30  // Gwałtowny wzrost
  83.         case 202104 => 10  // Znowu spadek
  84.       }
  85.       patientId <- 1 to patientMax
  86.      
  87.       // Ograniczona liczba transakcji w ostatnim miesiącu, aby złamać regułę LOW_TRANSACTIONS_NUMBER
  88.       if !(month == 202104 && patientId > 0)  // W ostatnim miesiącu będzie 0 transakcji
  89.      
  90.       // Pozostałe dane
  91.       trnId = s"TRN_${month}_${patientId}_0"
  92.       packId = if (patientId % 2 == 0) "PACK003" else "PACK005"
  93.       day = month * 100 + 15
  94.       prescriberId = if (packId == "PACK003") Some(s"DOC_${patientId % 5 + 1}") else None
  95.     } yield {
  96.       (SHOP_BAD, month, s"PAT_$patientId", trnId, packId, day, prescriberId.orNull)
  97.     }).toSeq
  98.    
  99.     // Łączymy dane i tworzymy DataFrame
  100.     val allData = goodShopData ++ badShopData
  101.    
  102.     spark.createDataFrame(allData).toDF(
  103.       "shop_id", "month_id", "patient_id", "trn_id", "pack_id", "day_id", "prescriber_id"
  104.     )
  105.   }
  106.  
  107.   /**
  108.    * Generuje wszystkie dane testowe i zapisuje je jako tabele tymczasowe
  109.    */
  110.   def generateAllTestData(): Unit = {
  111.     val panel = generatePanelData()
  112.     val dimPack = generateDimPackData()
  113.     val sales = generateSalesData()
  114.    
  115.     // Tworzenie tabel tymczasowych
  116.     panel.createOrReplaceTempView("lrx_panel")
  117.     dimPack.createOrReplaceTempView("dim_pack")
  118.     sales.createOrReplaceTempView("lrx_sales")
  119.    
  120.     println(s"Wygenerowano dane testowe:")
  121.     println(s"  - Panel: ${panel.count()} sklepy")
  122.     println(s"  - DimPack: ${dimPack.count()} paczek")
  123.     println(s"  - Sales: ${sales.count()} rekordów sprzedaży")
  124.   }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement