希望将我的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'
答案 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]|
+---+--------------------------------------------------------------------------------+