Python pyspark字计数器

Python pyspark字计数器,python,pyspark,Python,Pyspark,我有一个pyspark数据框,有三列,用户id、关注者计数和tweet,其中tweet是字符串类型 首先,我需要执行以下预处理步骤: -所有文本小写 -删除标点符号和任何其他非ascii字符 -标记由“”分隔的单词 然后,我需要在所有tweet值中汇总这些结果: -查找每个单词出现的次数 -按频率排序 -提取前n个单词及其各自的计数 我在GitHub上找到了以下资源wordcount.py;然而,我不明白代码在做什么;正因为如此,我在笔记本中调整它时遇到了一些困难 lines=spark.re

我有一个pyspark数据框,有三列,用户id、关注者计数和tweet,其中tweet是字符串类型

首先,我需要执行以下预处理步骤: -所有文本小写 -删除标点符号和任何其他非ascii字符 -标记由“”分隔的单词

然后,我需要在所有tweet值中汇总这些结果: -查找每个单词出现的次数 -按频率排序 -提取前n个单词及其各自的计数

我在GitHub上找到了以下资源wordcount.py;然而,我不明白代码在做什么;正因为如此,我在笔记本中调整它时遇到了一些困难

lines=spark.read.textsys.argv[1].rdd.maplambda r:r[0] 计数=行。flatMaplambda x:x.split“”\ .maplambda x:x,1\ .reduceByKeyadd 输出=计数。收集 对于word,在输出中计数: 打印%s:%i%word,计数 编辑1:我认为我没有明确表示我试图将此分析应用于专栏tweet

编辑2:我更改了上面的代码,将df.tweet作为参数插入到代码的第一行,并触发了一个错误。因此,我认为无法将列传递到此工作流中;我不知道该如何处理这个问题

TypeError:列不可编辑 我已经按照建议添加了一些调整。工作起来很有魅力!我不知道我可以将用户定义的函数发送到lambda函数中。事实证明,这是一种将此步骤添加到工作流中的简单方法

进口稀土 def过程_text: text=text.lower text=re.subpattern='[^A-z^\s]',repl=,string=text.split'' 返回[如果word!=,则在文本中逐字返回] 过程_文本“hi 343” >>>>['hi'] count\u rdd=df.selecttweet.rdd.flatMaplambda x:process\u textx[0]\ .maplambda x:x,1.ReduceBeyLambda x,y:x+y 清点
不确定错误是由于输出中的字、计数:还是由于列上的RDD操作引起的

但是,您可以简单地使用:

对于RDD样式: 您正在尝试对pyspark.sql.column.column对象执行RDD操作。上面是列中所有单词的简单字数统计

如果要在列本身上添加,可以使用以下方法执行此操作:

对于柱样式:
您可以使用pyspark.sql.functions和从pyspark.sql.functions执行预处理步骤。

不确定该错误是由于word、count in output:还是由于列上的RDD操作引起的

但是,您可以简单地使用:

对于RDD样式: 您正在尝试对pyspark.sql.column.column对象执行RDD操作。上面是列中所有单词的简单字数统计

如果要在列本身上添加,可以使用以下方法执行此操作:

对于柱样式: 您可以使用pyspark.sql.functions和从pyspark.sql.functions执行预处理步骤。

1:RDD风格

2:数据帧样式

3:SQL风格

1:RDD风格

2:数据帧样式

3:SQL风格


非常感谢,我最后发送了一个用户定义的函数,您在其中使用了x[0]。拆分,效果非常好!一个问题-为什么使用x[0]?我本以为这只会找到tweet字符串中的第一个字符。当我在数据帧上调用rdd时,它会返回一个行对象,它是元组的一个缩略。您可以在第一个索引处访问元组值。非常感谢,我最终发送了一个用户定义的函数,您在其中使用了x[0]。拆分,效果非常好!一个问题-为什么使用x[0]?我本以为这只会找到tweet字符串中的第一个字符。当我在数据帧上调用rdd时,它会返回一个行对象,它是元组的一个缩略。您可以访问第一个索引处的元组值。
count_rdd = df.select("tweets").rdd.flatMap(lambda x: x[0].split(' ')) \
              .map(lambda x: (x, 1)).reduceByKey(lambda x,y: x+y)
import pyspark.sql.functions as F

count_df = df.withColumn('word', F.explode(F.split(F.col('tweets'), ' ')))\
    .groupBy('word')\
    .count()\
    .sort('count', ascending=False)
  lines=spark.sparkContext.textFile("../data/book.txt")
wordcount=lines.flatMap(lambda x: x.split(' ')).map(lambda x: (x,1)).reduceByKey(lambda x,y:x+y)\
.map(lambda x: (x[1], x[0])).sortByKey(False).collect()


#for word in wordcount:    print(word[1],word[0])
for i in range(2):    print(wordcount[i][1],wordcount[i][0])
  from pyspark.sql.functions import split,col,explode,count


dflines=spark.read.text("../data/book.txt")
dfwords=dflines.withColumn('words',split(col('value'),' '))\
.withColumn('word',explode(col('words')))\
.drop('value','words').groupBy('word').agg(count('word')\
 .alias('count')).orderBy('count',ascending=False).show(2)
sqllines=dflines.createOrReplaceTempView('lines')

spark.sql("""select word, count(word) count from
(select explode(split(value,' '))  word from lines) words group by word order by count desc""").show(2)