在pyspark中创建一个大字典

Kam*_*mal 11 python apache-spark

我试图使用pyspark解决以下问题.我在hdfs上有一个文件,格式是查找表的转储.

key1, value1
key2, value2
...
Run Code Online (Sandbox Code Playgroud)

我想将它加载到pyspark中的python字典中,并将其用于其他目的.所以我试着这样做:

table = {}
def populateDict(line):
    (k,v) = line.split(",", 1)
    table[k] = v

kvfile = sc.textFile("pathtofile")
kvfile.foreach(populateDict)
Run Code Online (Sandbox Code Playgroud)

我发现表变量没有被修改.那么,有没有办法在spark中创建一个大的内存哈希表?

aar*_*man 6

foreach是分布式计算,因此您不能指望它修改仅在驱动程序中可见的数据结构。你想要的是。

kv.map(line => { line.split(" ") match { 
    case Array(k,v) => (k,v)
    case _ => ("","")
}.collectAsMap()
Run Code Online (Sandbox Code Playgroud)

这是在 scala 中,但您明白了,重要的功能是collectAsMap()将地图返回给驱动程序。

如果您的数据非常大,您可以使用 PairRDD 作为地图。第一个映射到对

    kv.map(line => { line.split(" ") match { 
        case Array(k,v) => (k,v)
        case _ => ("","")
    }
Run Code Online (Sandbox Code Playgroud)

然后您可以访问rdd.lookup("key")which 返回与键关联的一系列值,尽管这肯定不会像其他分布式 KV 存储那样有效,因为 spark 并不是真正为此而构建的。