solved:spark使非唯一字段按发生顺序有一个id

mfuanj7w  于 2021-05-29  发布在  Spark
关注(0)|答案(2)|浏览(439)

我有一堆csv文件,我读入spark(与pyspark一起工作),然后我想将它们在一个特定字段上连接到一个大表。
问题是,此字段不是唯一的,但关联的属性是唯一的。它是唯一的数据来源,但这些信息被删除之前,我把他们作为csv。我无法使用连接查询的附加属性来声明文件之间的连接。但在所有文件中出现的顺序说明了结构。所以,如果我能做一个人工id,它有id和文件中出现的次数,它就会工作。
我的问题是,我是否可以定义一个sparksql查询(或者另一种pyspark方式),用它为每个文件中的非唯一行添加一个连续的计数,这样我就可以将它用于我的连接?
我想要的是:

  1. ID| ct(ID) | generated_number
  2. A | 2 | 1
  3. A | 2 | 2
  4. A | 2 | 3
  5. B | 1 | 1
  6. C | 2 | 1
  7. C | 2 | 2
  8. D | 1 | 1
  9. E | 3 | 1
  10. E | 3 | 2
  11. E | 3 | 3

基于此,我可以创建一个新的id作为conc(id,''uu',generated'u number)–至少我可以为具有非唯一性的行这样做。
有没有一个聪明的sparknative版本,我真的不想在shell脚本中修改源数据(awk我会想到)
谢谢
解决方案:
两个答案都符合解决方案,非常感谢。我现在的做法如下:

  1. SELECT ID,
  2. row_number() OVER (
  3. PARTITION BY ID
  4. ORDER BY ID ) as row_count,
  5. count(ID) OVER (
  6. PARTITION BY ID
  7. ORDER BY ID ) as count
  8. FROM TB_TEMP AS main
  9. WHERE cellname_s = "A"

好吧,不用where子句,但是为了显示它使它更容易;)
这给了我想要的输出:

  1. +----------+---------+-----+
  2. | ID|row_count|count|
  3. +----------+---------+-----+
  4. | A| 1| 4|
  5. | A| 2| 4|
  6. | A| 3| 4|
  7. | A| 4| 4|
  8. +----------+---------+-----+

为了得到我唯一的身份证,我会做一个

  1. CASE WHEN count > 1 THEN concact(ID, "_", row_count) ELSE ID END AS ID

因此,给我唯一的字段,我没有,但不操纵字段已经是唯一的,因为这是更好的人与数据工作。

g52tjvyc

g52tjvyc1#

捕获的是非唯一值。可以使用单调递增的\u id()函数。

  1. tst=sqlContext.createDataFrame([('A',2),('B',2),('A',2),('A',3),('B',4),('A',2),('B',2)],schema=("id","count"))
  2. tst_id = tst.withColumn("inc_id",monotonically_increasing_id())

这将确保为非唯一值分配唯一ID。对于您的情况,您也可以使用它来连接id。但是,如果您想要连续且外观更好的id号,那么我们可以在生成的单调递增的id上使用行号(性能方面代价高昂):

  1. w=Window.partitionBy('id','count').orderBy('inc_id')
  2. tst_row = tst_id.withColumn("uniq_id",F.row_number().over(w))

所以,最后

  1. tst_row.sort('id','count','uniq_id').show()
  2. +---+-----+----------+-------+
  3. | id|count| inc_id|uniq_id|
  4. +---+-----+----------+-------+
  5. | A| 2| 0| 1|
  6. | A| 2| 2| 2|
  7. | A| 2|8589934594| 3|
  8. | A| 3|8589934592| 1|
  9. | B| 2| 1| 1|
  10. | B| 2|8589934595| 2|
  11. | B| 4|8589934593| 1|
  12. +---+-----+----------+-------+
展开查看全部
qyyhg6bp

qyyhg6bp2#

我想你要的是排号
使用类似

  1. select id,CT(id),row_number() over(partition by id,CT(id) order by id) from**your**table

如果您想在Dataframe中使用它,您可以使用:

  1. https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html

相关问题