使用开始和结束分隔符分隔多行记录

时间:2017-11-21 06:33:13

标签: pyspark

我有一个这样的文件(我提供样本数据,但文件非常大):

QQ
1
2
3
ZZ
b
QQ
4
5
6
ZZ
a
QQ
9
8
23

我想读取QQ和ZZ之间的数据,所以我希望数据框看起来像:

[1,2,3]
[4,5,6]
[9,8]

我尝试的代码如下所示,但这对于大数据来说是失败的。

from pyspark.sql.types import *
from pyspark import SparkContext
from pyspark.sql import SQLContext

path ="/tmp/Poonam.Raskar/Sample.txt"
sc =SparkContext()
sqlContext = SQLContext(sc)
sc.setLogLevel("ERROR")
textFile = sc.textFile(path)

wi = textFile.zipWithIndex()
startPos = wi.filter(lambda x: x[0].startswith('QQ')).map(lambda (key,index) : index).collect()
endPos = wi.filter(lambda x: x[0].startswith('ZZ')).map(lambda (key,index) : index).collect()
finalPos =zip(startPos,endPos)
dtlRow =[]

for pos in finalPos:
        #print(pos)
        #print(wi.filter())
        dtlRow1 = [[wi.filter(lambda x: x[1]==1).map(lambda (key,index) : key ,).collect() for i in range(pos[0],pos[1])]]  #Required option for collect...program is taking long time while executing this statement
        #print(dtlRow1)
        dtlRow.append(dtlRow1)


cSchema = StructType([StructField("DataFromList", ArrayType(StringType()))])
df = sqlContext.createDataFrame(dtlRow,schema=cSchema)
print(df.show())

1 个答案:

答案 0 :(得分:0)

我怀疑你的方法的大数据问题是你有一个中间步骤,你收集rdd,这将无法扩展。这是一种使用rdd / dataframe的方法:

NonExistingProcedure