在 DataFrame 的分组数据中查找比率
Find ratio within the grouped data in DataFrame
这是数据框 - 基本上,有两种可能的类型 - X
和 Y
用于不同的来源 A
、B
、C
,D
...
Source | Type
-------------------
A | X
A | Y
B | X
C | Y
A | X
D | Y
... | ...
最终目标是收集百分比:ratio(X in A) = count(X) / (count(X) + count(Y))
因此,在我们的示例中,ratio(X in A) = 2 / (2 + 1) = 2 / 3 ~ 0.667
非常简单,但我无法在 one select 中仅使用 Streaming API v2(结构化流,Dataframes)如何做到这一点?
从我的角度来看,只有通过 map
函数才可行...
这就是我现在所拥有的 - X
和 Y
类型的分散计数
msgDataFrame
.select(SOURCE, TYPE)
.where(msgDataFrame.col(TYPE).equalTo("X"))
.groupBy(SOURCE)
.count()
.show(); // <-- gives me count for 'X'-es
msgDataFrame
.select(SOURCE, TYPE)
.filter(msgDataFrame.col(TYPE).equalTo("Y"))
.groupBy(SOURCE)
.count()
.show(); // <-- gives me count for 'Y'-cs
这应该有效:
msgDataFrame
.select("SOURCE", "TYPE")
.groupBy("SOURCE").pivot("TYPE", Seq("X", "Y")).agg(count(col("TYPE")))
.withColumn("Ratio", col("X") / (col("X") + col("Y")))
.show
这是数据框 - 基本上,有两种可能的类型 - X
和 Y
用于不同的来源 A
、B
、C
,D
...
Source | Type
-------------------
A | X
A | Y
B | X
C | Y
A | X
D | Y
... | ...
最终目标是收集百分比:ratio(X in A) = count(X) / (count(X) + count(Y))
因此,在我们的示例中,ratio(X in A) = 2 / (2 + 1) = 2 / 3 ~ 0.667
非常简单,但我无法在 one select 中仅使用 Streaming API v2(结构化流,Dataframes)如何做到这一点?
从我的角度来看,只有通过 map
函数才可行...
这就是我现在所拥有的 - X
和 Y
类型的分散计数
msgDataFrame
.select(SOURCE, TYPE)
.where(msgDataFrame.col(TYPE).equalTo("X"))
.groupBy(SOURCE)
.count()
.show(); // <-- gives me count for 'X'-es
msgDataFrame
.select(SOURCE, TYPE)
.filter(msgDataFrame.col(TYPE).equalTo("Y"))
.groupBy(SOURCE)
.count()
.show(); // <-- gives me count for 'Y'-cs
这应该有效:
msgDataFrame
.select("SOURCE", "TYPE")
.groupBy("SOURCE").pivot("TYPE", Seq("X", "Y")).agg(count(col("TYPE")))
.withColumn("Ratio", col("X") / (col("X") + col("Y")))
.show