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

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

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

ID| ct(ID) | generated_number
A | 2      | 1 
A | 2      | 2
A | 2      | 3
B | 1      | 1
C | 2      | 1
C | 2      | 2
D | 1      | 1
E | 3      | 1
E | 3      | 2
E | 3      | 3

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

SELECT  ID,
   row_number() OVER (
        PARTITION BY ID
        ORDER BY ID ) as row_count,
   count(ID) OVER (
        PARTITION BY ID
         ORDER BY ID ) as count
FROM TB_TEMP AS main
WHERE cellname_s = "A"

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

+----------+---------+-----+
|        ID|row_count|count|
+----------+---------+-----+
|         A|        1|    4|
|         A|        2|    4|
|         A|        3|    4|
|         A|        4|    4|
+----------+---------+-----+

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

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

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

g52tjvyc

g52tjvyc1#

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

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

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

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

所以,最后

tst_row.sort('id','count','uniq_id').show()
+---+-----+----------+-------+
| id|count|    inc_id|uniq_id|
+---+-----+----------+-------+
|  A|    2|         0|      1|
|  A|    2|         2|      2|
|  A|    2|8589934594|      3|
|  A|    3|8589934592|      1|
|  B|    2|         1|      1|
|  B|    2|8589934595|      2|
|  B|    4|8589934593|      1|
+---+-----+----------+-------+
qyyhg6bp

qyyhg6bp2#

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

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

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

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

相关问题