我有一堆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
因此,给我唯一的字段,我没有,但不操纵字段已经是唯一的,因为这是更好的人与数据工作。
2条答案
按热度按时间g52tjvyc1#
捕获的是非唯一值。可以使用单调递增的\u id()函数。
这将确保为非唯一值分配唯一ID。对于您的情况,您也可以使用它来连接id。但是,如果您想要连续且外观更好的id号,那么我们可以在生成的单调递增的id上使用行号(性能方面代价高昂):
所以,最后
qyyhg6bp2#
我想你要的是排号
使用类似
如果您想在Dataframe中使用它,您可以使用: