如何组合pyspark节点生成的文本文件

时间:2017-10-26 20:09:58

标签: python pyspark

希望将我的pyspark输出保存到.txt文件中以供将来参考。我写了以下代码来保存我的文件

fileName=names1[i]+".txt" # Generating file name as fieldname.txt
    #data1.groupby(names1[i]).agg(F.collect_set("Passenger_Id")).rdd.saveAsTextFile(names1[i]+'.txt') 
    data.groupby(names1[i]).agg(F.collect_set("Passenger_Id")).rdd.saveAsTextFile(fileName)

但是在运行代码之后我看到了带有可变文件名的文件夹。如果我的文件名是abc.txt,那么我看到文件夹名称为abc.txt,并且在该文件夹下有很多没有任何扩展名的部分文件。以下是我的零件文件的示例格式

Row(Airpotr=u'ST', collect_set(Passenger_Id)=[u'30143072', u'36374515', u'45806865', u'37771107', u'18541154', u'91481534', u'30343069', u'41482082'])

我如何一起检索这些零件文件&创建一个火花数据框?

我还尝试按照here

提到的步骤进行操作
import os
home=os.getcwd()
names1="Airpotr.txt"
dirPath = os.path.join(home, names1)
os.mkdir(dirPath)
textFiles = sc.wholeTextFiles(dirPath)
sorted(textFiles.collect())

但收到错误消息

SError: [Errno 17] File exists: '/user-home/.../Airpotr.txt'

1 个答案:

答案 0 :(得分:1)

.txt文件不是将数据直接重新加载到数据框中的正确格式。您应该使用parquet或其他列式数据存储格式。存储和加载数据:

data.write.parquet(fileName)
data = spark.read.parquet(fileName)

但是因为你的数据已经存储了。

<强> 1。一次加载所有数据

您可以使用加载函数中的正则表达式在一个设置中加载文件:

rdd = sc.textFile(",".join([name + ".txt" for name in names1]))

这会将您的平面文件加载到RDD中,其中每行的类型为string

"Row(Airpotr=u'ST', collect_set(Passenger_Id)=[u'30143072', u'36374515', u'45806865', u'37771107', u'18541154', u'91481534', u'30343069', u'41482082'])"

<强> 2。将RDD转换为数据帧

由于所有文件中的第一个变量名称都不同,我们会使用wholeTextFiles来加载数据而不是textFile。此函数将文件的路径添加为每行的第一个元素。 然后我们将使用自定义函数来解析每一行:

def parse_line(l):
    name = re.findall('.*/(.*?)\.txt/', l[0])[0]
    line = re.findall(name + "=u'(.*)', collect_set\(Passenger_Id\)=\[u'(.*)'\]", l[1])
    return Row(
        key = line[0][0],
        values = line[0][1].split("', u'"))

data = sc.wholeTextFiles(",".join([output_path + f + ".txt" for f in filenames]))\
    .filter(lambda l: l[1] != "")\
    .map(parse_line)\
    .toDF()
data.show()
    +---+--------------------------------------------------------------------------------+
    |key|values                                                                          |
    +---+--------------------------------------------------------------------------------+
    |ST |[30143072, 36374515, 45806865, 37771107, 18541154, 91481534, 30343069, 41482082]|
    +---+--------------------------------------------------------------------------------+