创建一个分组值的列

Posted

技术标签:

【中文标题】创建一个分组值的列【英文标题】:create a column that group values 【发布时间】:2016-03-11 11:35:34 【问题描述】:

要恢复,我想将关联的值放入相同的组中:

这是我所拥有的:

col1    col2
1        2
1        3
2        3
4        5
5        6

我想要这个:

col1    col2    group
1        2        1
1        3        1
2        3        1
4        5        2
5        6        2

如果我手动进行的话,这里是生成这两个组的步骤。

第 1 行:1 与 2 相关联,因此它们在同一个组中,我们称之为第 1 组 第 2 行:第 1 行位于第 1 组,现在第 1 行与第 3 行相关联,因此第 3 行也在第 1 组中 第 3 行:第 2 行在第 1 组中,第 3 行也在第 1 组中,因此它们在第 1 组中 第 4 行:4 不是组 1 的值,因此我创建了一个名为 2 的新组并将其与 5 关联 第 5 行:5 有一个组 2,并与 6 相关联,因此它有第 2 组。

您是否有在 SQL 中解决此问题的想法。 知道我正在使用 Hive 或 pyspark

【问题讨论】:

这个问题与查找图的连通分量相同。每行代表两个顶点之间的一条边。 Hive/MapReduce 不适合解决这个问题,但是有一个名为 GraphX 的 Spark 库,幸运的是,他们刚刚通过新的 GraphFrames 库 (databricks.com/blog/2016/03/03/introducing-graphframes.html) 添加了一个 Python API,因此希望您可以让集群管理员更新火花。 谢谢你的回答解决了问题。我使用了 graphframe 和 connectedComponents() 函数。 【参考方案1】:

根据 A.R.Ferguson 的回答,我能够使用 pyspark 和 graphframe 找出解决方案:

from graphframes import *
vertices = sqlContext.createDataFrame([
  ("A",  1),
  ("B",  2),
  ("C",  3),
  ("D",  4),
  ("E",  5),
  ("F",  6)], ["name",  "id"])
edges = sqlContext.createDataFrame([
  (1, 2),
  (1, 3),
  (2, 3),
  (4, 5),
  (5, 6)], ["src", "dst"])
g = GraphFrame(vertices, edges)
result = g.connectedComponents()
result.show()

再次感谢弗格森。

【讨论】:

以上是关于创建一个分组值的列的主要内容,如果未能解决你的问题,请参考以下文章

怎样将sqlserver数据库里的列字段当做列名并依此分组?

通过按类型分组创建一个新列,新列的值是整个组的列值

如何仅按某个列值的前几个字母对 SQL 查询进行分组?

点击屋。如何创建一个保留另一列的最后一个值的列?

如何从 MySQL 中具有累积值的列创建具有增量值的列?

HiveQL 按列值的子字符串分组并识别缺失的组