Spark Datafram中基于不同值的类别列

2024-04-25 17:36:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的源数据中,我没有任何可以对数据进行分组的类别列。你知道吗

因此,我想在Spark dataframe中添加一个新的定制category列,该列基于另一个列,比如(“QNAME”)distinct值。我想在分组中使用它来旋转。你知道吗

直到现在,我都不知道。。。如何得到这个。你知道吗

假设我有下面的源数据帧

   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

所以,在列(“QNAME”)值的基础上,我想对不同的值组合进行分类。 例如,ditinct值是(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来做这个。 任何帮助或建议都将不胜感激。 提前谢谢!你知道吗


Tags: 数据标记dataframe类别sparkbbbcccqname
1条回答
网友
1楼 · 发布于 2024-04-25 17:36:07

任务可以通过窗口函数“row\u number()”完成。如果考虑到 乔纳森·迈尔斯评论说,最好只用数字而不是字符:

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|
+    +  -+ -+ -+ -+

相关问题 更多 >