Python 如何像使用num\u to\u word\u dict(如果存在)一样通过键访问值?
有没有一种使用ApacheSpark通过键访问值的方法 考虑以下简单示例,其中有两个我想加入的键值对列表:Python 如何像使用num\u to\u word\u dict(如果存在)一样通过键访问值?,python,apache-spark,Python,Apache Spark,有没有一种使用ApacheSpark通过键访问值的方法 考虑以下简单示例,其中有两个我想加入的键值对列表: num_to_letter = sc.parallelize([(1,'a'),(2,'b'),(3,'c')]) num_to_word = sc.parallelize([(1, 'one'),(2,'two'),(3,'three')]) num_to_letter.join(num_to_word).map(lambda x: x[1]).collect() 结果将字母与数字的单
num_to_letter = sc.parallelize([(1,'a'),(2,'b'),(3,'c')])
num_to_word = sc.parallelize([(1, 'one'),(2,'two'),(3,'three')])
num_to_letter.join(num_to_word).map(lambda x: x[1]).collect()
结果将字母与数字的单词匹配:
[('a', 'one'), ('b', 'two'), ('c', 'three')]
该示例显示了使用联接来完成此操作,但如果num_to_word是一个字典,则作为映射操作来实际执行此操作应该更有效:
num_to_word_dict = dict(num_to_word.collect())
num_to_letter.map(lambda x: (x[1], num_to_word_dict[x[0]])).collect()
问题是,有没有一种方法可以创建类似于num-to-word-dict
的东西,而不必收集num-to-word
中的值?有一个def-lookup(key:K):Seq[V]
函数定义在成对的RDD上,它将一个键解析为与该键关联的值列表。然而,在这种情况下,它将没有帮助,因为RDD不能在闭包中使用,如果我们想解析第二个RDD的值,就需要使用RDD 鉴于这两个数据集都是RDD,
join
是一种很好的方法
如果包含分辨率关联的RDD足够小,可以放入驱动程序和每个执行器的内存中,那么在Spark中实现这种分辨率的最有效方法是创建一个映射作为广播变量,并在每个分区中映射其他RDD的元素
val numWordBC = sc.broadcast(numToWord.collectAsMap)
val letterToWord = numToLetter.mapPartitions{partition =>
val numWord = numWordBC.value
partition.map{case (k,v) => (numWord(k),v)}
}
在我的例子中是这样的,但是当分辨率表不够小,无法放入内存时会怎样呢?那么
join
就是你的朋友<代码>查找用于此目的的成本会高得离谱。问题是加入
抱怨打开的文件太多
,我没有管理员权限,无法增加ulimit,因此查找是一种解决方法。也许你应该问一个问题,关于打开的文件太多
!有人会想。。。但是以前有人问过,答案似乎总是“增加你的ulimit”。