我试图在pyspark中做一些手工操作,并且从一个特定的示例文件中,对于包“Rcpp”,我想知道有多少行属于它。我在pyspark中执行了以下操作以获得所需的结果
from pyspark import SparkConf, SparkContext
import collections
conf = SparkConf().setMaster("local").setAppName("RatingsHistogram")
sc = SparkContext(conf = conf)
lines = sc.textFile("<filepath>/2015-12-12.csv")
rdd=lines.map(lambda x: x.split(',')[6])
totalbypackage=rdd.map(lambda x: (x,1)).reduceByKey(lambda x,y: x+y)
data=totalbypackage.take(10)
#this was just to view the first 10 records
print(type(data))
print(data)
对于上面的代码,我得到以下结果
[(“package”,1),(“HistData”,159),(“RJSONIO”,1358),(“UsingR”,151),(“gridExtra”,1758),(“lme4”,1560),(“testthat”,1178),(“mvtnorm”,999),(“maps”,1586),(“sp”,1020)]
这仅仅是前10张唱片和它的列表。因为数据的类型是列表。 当我尝试执行下面的操作时,会出现错误,因为列表索引必须是整数或片,而不是str
print(data["Rcpp"])
在阅读了与同一错误相关的其他问题后,我了解到我们不能使用字符串值。那么,如何从列表中访问“Rcpp”的值呢? 我需要将列表转换为字典吗
由于
data
由键值对组成,因此使用的自然数据结构是字典。然后可以通过其键访问任何值,例如:您可能还希望更改代码,以便每个键只有一对引号
将列表转换为字典可能是一种选择,但我不建议这样做。它基本上破坏了最初使用pyspark/spark的动机
请注意,当您使用
take(n)
时,您正试图执行一个操作语句take(n)
将n条记录转换为一个列表,当不同的“包”数量增加时,该列表效率不高(如果有100万种包怎么办?)。在take()
之前使用filter()
将是一种更好、更有效、更美观的方法两个print语句都将在控制台上显示“Rcpp”包的计数
如果有帮助,请考虑对这个答案进行投票。eem>相关问题 更多 >
编程相关推荐