Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何像使用num\u to\u word\u dict(如果存在)一样通过键访问值?_Python_Apache Spark - Fatal编程技术网

Python 如何像使用num\u to\u word\u dict(如果存在)一样通过键访问值?

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() 结果将字母与数字的单

有没有一种使用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()
结果将字母与数字的单词匹配:

[('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”。