如何在pyspark中转置rdd(列表不是矩阵)

时间:2015-07-13 16:42:07

标签: apache-spark apache-spark-sql pyspark

我有一个rdd,字符串列表是['abc','ccd','xyz'...'axd']

当我“打印rdd.take(2)时,我希望它能让我回复['abc','ccd'],但相反它给了我一切。我很新兴火花或蟒蛇所以请原谅我如果这是一个愚蠢的问题。有没有办法将这个列表转换成行?

最终我需要将其转换为数据帧并插入到hive表中。

这是我的代码的一部分

domainsrdd = zonerdd.reduceByKey(lambda x,y: x + ' ' + y).map(lambda a:     (a[0], a[1].split(' ')))

print domainsrdd.take(2)

[(u'COOL', [u'shirtmaker.cool', u'videocandy.cool', u'the-happy-factory.cool', u'vic.cool', u'atl.cool',...... u'booze.cool'])]

def sampler(l, tldvar):
    tld = l[0]
    domain_data = l[1]
    domains = []
    ct = tldvar.value[tld]
    for item in domain_data:
        domains.extend([item])
        if len(domains) == ct:
            break
    return domains

domainslist = domainsrdd.map(lambda l: sampler(l, tldvar))

print domainslist.take(2) # still returns everything

[[u'shirtmaker.cool', u'videocandy.cool', u'the-happy-factory.cool',...])]

长话短说,我试图循环通过一组由tld组成的域并生成这些域名的样本,tldvar是一个字典,其中包含我需要为特定tld返回的域集。 TLD = com,net,org等!

2 个答案:

答案 0 :(得分:0)

domainslist的类型为RDD[Array[String]],因此当您执行take时,您将获得Array[Array[String]]。在您的情况下,根据您所说的内容(len(domains) == ct永远不会true)来填充数组永远不会受到限制

答案 1 :(得分:0)

这已解决 - 我使用的是flatmap而不是map。基本上这工作

domainslist = domainsrdd.flatmap(lambda l: sampler(l, tldvar))