pyspark-使用explode函数后添加行号

ltqd579y  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(787)

这个问题在这里已经有答案了

在pyspark中将列内容拆分为行(2个答案)
pysparkDataframe:自定义分解函数(2个答案)
7个月前关门了。
我正在做一个nlp项目,有包含多个句子的评论。我正在使用spark nlp包,它输出一列,其中包含每个评论中的句子列表。我正在使用explode为每个句子创建一行,但我想添加编号,以便知道哪个句子是1st、2nd等。我不知道如何使用row\u number(),因为我没有任何东西可以排序。
以下是我的数据:

REVIEW_ID REVIEW_COMMENTS     SENTENCES_LIST           
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]   
    2     Yeah. Ok.           [Yeah., Ok.]

我希望它看起来像这样:

REVIEW_ID REVIEW_COMMENTS     SENTENCES_LIST           SENTENCE  SENT_NUMBER
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]    Hi.       1
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]    Sent1.    2
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]    Sent2.    3
    2     Yeah. Ok.           [Yeah., Ok.]             Yeah.     1
    2     Yeah. Ok.           [Yeah., Ok.]             Ok.       2

我正在使用下面的代码,不知道如何使用row\u number(),因为除了在句子列表中的位置之外,我没有列可以用作“orderby”。

df2 = df.withColumn('SENTENCE', F.explode('SENTENCES_LIST'))
df3 = df2.withColumn('SENT_NUMBER',row_number().over(Window.partitionBy('REVIEW_ID').orderBy('????')))
7nbnzgx9

7nbnzgx91#

为了 Spark2.4+ ,您可以使用 explode 高阶函数 transform. ```
from pyspark.sql import functions as F

df.withColumn("list", F.explode(F.expr("""transform(SENTENCES_LIST,(x,i)-> struct(x as SENTENCE,(i+1) as SENT_NUMBER))""")))
.select("", "list.").show()

+---------+-----------------+--------------------+-----------+--------+-----------+

|REVIEW_ID| REVIEW_COMMENTS| SENTENCES_LIST| list|SENTENCE|SENT_NUMBER|

+---------+-----------------+--------------------+-----------+--------+-----------+

| 1|Hi. Sent1. Sent2.|[Hi., Sent1., Sen...| [Hi., 1]| Hi.| 1|

| 1|Hi. Sent1. Sent2.|[Hi., Sent1., Sen...|[Sent1., 2]| Sent1.| 2|

| 1|Hi. Sent1. Sent2.|[Hi., Sent1., Sen...|[Sent2., 3]| Sent2.| 3|

| 2| Yeah. Ok.| [Yeah., Ok.]| [Yeah., 1]| Yeah.| 1|

| 2| Yeah. Ok.| [Yeah., Ok.]| [Ok., 2]| Ok.| 2|

+---------+-----------------+--------------------+-----------+--------+-----------+

相关问题