count text中的特定字符-pyspark

iyfjxgzm  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(275)

我有一个pyspark数据框,其中包含一个文本列。此列中可以包含文本(字符串)信息。我只想在这列的每一行中数一数a,b,c,d等等。就像:

df = spark.read.csv('Data.csv', header=True)
df.select(['text']).show(truncate = False)
+-------------------------+
|text                     |
+-------------------------+
|BBEBEBEFC                |
|DDBBCDCBBECCBBE          |
|DCDBBEDBBE               |
+-------------------------+

现在我要计算每列中的b,c,d等的数量,并创建相应的列,如

+-------------------------+-------------------+
|text                     | B | C | D | E | F |
+-------------------------+---+---+---+---+---+
|BBEBEBEFC                | 4 | 1 | 0 | 3 | 1 | 
|DDBBCDCBBECCBBE          | 6 | 4 | 3 | 2 | 0 |
+-------------------------+---+---+---+---+---+

在Pandas中,可以简单地通过以下方式完成:

df['A'] = df['text'].str.count('A')
...

我想在没有循环的pyspark中执行相同的操作(数据量很大)。如果有人能提出更好的方法。

lymgl2op

lymgl2op1#

拆分、分解、分组依据、透视、计数:

import pyspark.sql.functions as F

df2 = (df.withColumn('miid', F.monotonically_increasing_id().alias('miid'))
         .withColumn('split_text', F.explode(F.split('text', '')))
         .filter("split_text != ''")
         .groupBy('text', 'miid')
         .pivot('split_text')
         .agg(F.count('*'))
         .fillna(0)
         .drop('miid')
      )

df2.show()
+---------------+---+---+---+---+---+
|           text|  B|  C|  D|  E|  F|
+---------------+---+---+---+---+---+
|DDBBCDCBBECCBBE|  6|  4|  3|  2|  0|
|     DCDBBEDBBE|  4|  1|  3|  2|  0|
|      BBEBEBEFC|  4|  1|  0|  3|  1|
+---------------+---+---+---+---+---+

相关问题