0

Ich möchte ein UDF erstellen, um Werte basierend auf verschiedenen Wahrscheinlichkeiten zufällig zuzuweisen.UDF zum zufälligen Zuweisen von Werten basierend auf verschiedenen Wahrscheinlichkeiten

In dem folgende Beispiel des vom Rande zurückgegebene Wertes abhängig:

  • 0 zu 0.5 Der Wert sollte A (50% Wahrscheinlichkeit)
  • 0,8-1 sollte der Wert B (20% Wahrscheinlichkeit,)
  • etwas anderes sollte der Wert c (30% Wahrscheinlichkeit)

val names = Array("A", "B", "C")

sein

Wenn ich jedoch das Ergebnis drucke, werden die Namen nicht basierend auf den in der UDF definierten Regeln zugewiesen.

+---+----+----+ 
| id| val|name| 
+---+----+----+ 
| 0|0.17| C| => should be A 
| 1|0.12| A| 
| 2|0.36| A| 
| 3|0.56| B| 
| 4|0.82| A|=> should be C 

Antwort

3

Hier passiert nichts Unerwartetes. Sie rufen rand Funktion zweimal auf, so erhalten Sie zwei verschiedene zufällige Werte.

Entweder das gleiche Saatgut für beide Anrufe bieten:

sqlContext.range(0, 100) 
    .select(
    $"id", 
    abs(rand(1)).alias("val"), 
    allocate(abs(rand(1))).alias("name") 
) 

oder den Wert wiederverwenden:

sqlContext.range(0, 100) 
    .withColumn("val", abs(rand)) 
    .withColumn("name", allocate($"val")) 
Verwandte Themen