python - 基于 Spark Dataframe 中不同值的类别列

标签 python scala apache-spark apache-spark-sql

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

因此,我想基于另一列 say("QNAME") 不同值在 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

因此,根据列(“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 - 基于 Spark Dataframe 中不同值的类别列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56514856/

相关文章:

apache-spark - Spark 结构化流的 Trigger.ProcessingTime 计时精度

apache-spark - Spark Streaming 和 Spark Structured Streaming 使用相同的微批处理引擎吗?

python - Numpy 切片结果与 for 循环不同

scala - 将稀疏特征向量分解为单独的列

xml - 如何在Scala XML中使用not操作进行选择?

apache-spark - Spark MLlib : building classifiers for each data group

python - Python3.1 中的 View ?

Python - 根据其他数据帧列中满足的条件填充 PANDAS 数据帧列

python - 在程序生命周期中替换 print func 换行符

scala - 创建简单项目 SBT 0.10.X