这个问题在这里已经有答案了:
在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('????')))
1条答案
按热度按时间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|
+---------+-----------------+--------------------+-----------+--------+-----------+