Nadal nowa do Scali. Próbuję obliczyć procenty na rzędach w SCALA. Rozważ następujące df:

val df = Seq(("word1", 25, 75),("word2", 15, 15),("word3", 10, 30)).toDF("word", "author1", "author2")

df.show

+-----+-------+-------+
| word|author1|author2|
+-----+-------+-------+
|word1|     25|     75|
|word2|     15|     15|
|word3|     10|     30|
+-----+-------+-------+

Wiem, że mogę użyć kodu takiego następującego i uzyskać oczekiwane wyjście, jednak zastanawiałem się, czy był lepszy sposób na to:

val df_2 = df
  .withColumn("total", $"author1" + $"author2")
  .withColumn("author1 pct", $"author1"/$"total")
  .withColumn("author2 pct", $"author2"/$"total")
  .select("word", "author1 pct", "author2 pct")

df_2.show

+-----+-----------+-----------+
| word|author1 pct|author2 pct|
+-----+-----------+-----------+
|word1|       0.25|       0.75|
|word2|        0.5|        0.5|
|word3|       0.25|       0.75|
+-----+-----------+-----------+

Punkty bonusowe, aby dać mu format procentowy za pomocą "%" i brak dziesiętnych. Dziękuję Ci!

0
st_jimmy145 24 marzec 2021, 18:25

1 odpowiedź

Najlepsza odpowiedź

Być może można było bezpośrednio obliczyć i wybrać procenty, zamiast używać .withColumn i użyj concat, aby dodać znak {x2}} na końcu:

val df2 = df.select(
    $"word", 
    concat(($"author1"*100/($"author1" + $"author2")).cast("int"), lit("%")).as("author1 pct"), 
    concat(($"author2"*100/($"author1" + $"author2")).cast("int"), lit("%")).as("author2 pct")
)

df2.show
+-----+-----------+-----------+
| word|author1 pct|author2 pct|
+-----+-----------+-----------+
|word1|        25%|        75%|
|word2|        50%|        50%|
|word3|        25%|        75%|
+-----+-----------+-----------+

Jeśli chcesz zachować typy danych numerycznych, możesz to zrobić

val df2 = df.select(
    $"word", 
    ($"author1"*100/($"author1" + $"author2")).cast("int").as("author1 pct"), 
    ($"author2"*100/($"author1" + $"author2")).cast("int").as("author2 pct")
)
1
mck 25 marzec 2021, 09:42