python - 基于 Spark Dataframe 中不同值的类别列
问题描述
在我的源数据中,我没有可以对数据进行分组的任何类别列。
因此,我想根据另一列 say("QNAME") distinct value 在 Spark 数据框中添加一个新的自定义类别列。我想在 Group By to Pivot 中使用它。
直到现在,我不知道......如何得到这个。
假设我有以下源数据框
Qname b c d
SPT 1 10 555
MTK 2 20 556
NKP 3 30 557
LKM 4 40 558
SPT 5 50 559
MTK 7 70 561
QRS 6 60 560
NKP 7 70 561
SPT 5 50 559
LKM 7 70 561
QRS 7 70 561
MTK 7 70 561
NKP 7 70 561
因此,基于 column("QNAME") 值,我想对不同的值组合进行分类。例如,不同的值是(SPT,MTK,NKP,LKM,QRS)......所以这个值的第一次出现将被标记为“aaa”,然后第二次出现将被标记为“bbb”等等。
所以,下面是预期的输出。
Category Qname b c d
"aaa" SPT 1 10 555
"aaa" MTK 2 20 556
"aaa" NKP 3 30 557
"aaa" LKM 4 40 558
"bbb" SPT 5 50 559
"bbb" MTK 7 70 561
"aaa" QRS 6 60 560
"bbb" NKP 7 70 561
"ccc" SPT 5 50 559
"bbb" LKM 7 70 561
"bbb" QRS 7 70 561
"ccc" MTK 7 70 561
"ccc" NKP 7 70 561
我正在使用 Scala 和 Spark 来执行此操作。任何帮助或建议都可以解决这个问题。提前致谢!
解决方案
任务可以通过窗口函数“row_number()”完成。如果考虑到 Jonathan Myers 的评论,最好只使用数字而不是字符:
val df = Seq(
("SPT", 1, 10, 555),
("MTK", 2, 20, 556),
("NKP", 3, 30, 557),
("LKM", 4, 40, 558),
("SPT", 5, 50, 559),
("MTK", 7, 70, 561),
("QRS", 6, 60, 560),
("NKP", 7, 70, 561),
("SPT", 5, 50, 559),
("LKM", 7, 70, 561),
("QRS", 7, 70, 561),
("MTK", 7, 70, 561),
("NKP", 7, 70, 561)
).toDF(
"Qname", "b", "c", "d"
)
// action
val categoryWindow = Window.partitionBy($"Qname").orderBy("c")
val result = df.withColumn("Category", row_number().over(categoryWindow))
结果:
+--------+-----+---+---+---+
|Category|Qname|b |c |d |
+--------+-----+---+---+---+
|1 |SPT |1 |10 |555|
|1 |NKP |3 |30 |557|
|1 |QRS |6 |60 |560|
|1 |LKM |4 |40 |558|
|1 |MTK |2 |20 |556|
|2 |NKP |7 |70 |561|
|2 |LKM |7 |70 |561|
|2 |QRS |7 |70 |561|
|2 |SPT |5 |50 |559|
|2 |MTK |7 |70 |561|
|3 |NKP |7 |70 |561|
|3 |MTK |7 |70 |561|
|3 |SPT |5 |50 |559|
+--------+-----+---+---+---+
推荐阅读
- python - 共享内存缓冲区 Postgresql
- kubernetes - ZMQ pub/sub 在 kubernetes 中连接 2 分钟
- python - 给 pandas 一个可迭代的 python 和一个 pd.Series 的列之间的区别
- pandas - 如何将熊猫数据框转换为具有混合数据类型的考拉
- vb.net - 如何在文本文件中的行旁边附加一个新的字符串(数据)行和一个新的“索引号”
- c# - 为什么 Visual Studio 无法在谓词中正确编译 C# long TryParse?
- angular - 我可以使用指定的种子运行 Karma 测试吗?
- android - Flutter Image_picker 无法解析所有工件以进行配置
- swift - 将 javascript 注入 SwiftUI WebKit
- php - Laravel 注册页面 eero