如何使用Python动态获取RDD的值?

时间:2018-02-24 04:03:10

标签: python apache-spark pyspark

以下是校园系统中图书的样本记录。每本书记录都是一个文本文件。我用以下内容加载了记录:

books = sc.wholeTextFiles (file:///data/dir/*/*/*/”)     

这会给我一个RDD。 RDD中的一条记录如下:

[[‘Call No: 56CB',
  'Title:  Global Warming',
  'Type: Serial,
  'Database:  AWS898,',
 ‘Microfilm:  Y,',
  'Access:  Public ,',
]]

我试图提取RDD的4到N个元组位置的值。总是有0到4个元组。但是RDD可能会错过第5个和更多的元组,如下所示:

[[‘Call No: 56CB',
  'Title:  Science 101',
  'Type: Serial,’
  'Database:  AWS898,',
   ‘Microfilm:  Y,',
]]

因此,代码必须灵活处理RDD的可变长度。我有以下代码可以获得4和5元组,但是当RDD有4到15个元组时,这不灵活:

Summary1 = books.map(lambda x: (x[4]))
Summary2 = books.map(lambda x: (x[5]))

我可以通过以下方式获得RDD的长度:

LenRDD = books.map(lambda x: len(x)).collect()

你能帮我写一下python代码,让我动态地获得第四代LenRDD元组吗?

以下是其中一个文件的示例:

Call No: 56CB
Title:  Global Warming
Type: Serial
Database:  AWS894
Microfilm:  Y
Access:  Public
Location: Oxford
Size:  987 MB
Key:  677867IPOIO

1 个答案:

答案 0 :(得分:0)

根据我对你的问题的理解,你试图过滤掉每个文本文件的前4行,并在rdds 中保留每个文件的其余行。如果我的理解是正确的,那么你应该正在阅读文件

books = sc.wholeTextFiles("file:///data/dir/*/*/*/")

然后你编写一个函数来删除数组中的前四个记录

def delete(x):
    if(len(x)>4):
        for index in range(0,4):
            del x[0]
    return x

然后使用上面的函数从每个文本文件中删除前四行,并将其余行作为rdd

summary1 = books.map(lambda x: delete(x[1].split("\n"))).map(lambda x: "\n".join(x))

你应该得到你想要的东西