我在一个数据湖上有多个csv文件。我可以连接到数据湖,甚至可以列出文件。但是我需要将这些文件放在一个数据框中,以便可以将此数据加载到SQL。加载到SQL也没有问题。 问题在于,只有datalakefolder中最后一个文件的内容才被读取和写入SQL(因此也被写入数据帧)。可能是因为数据帧每次都被覆盖。但是我不知道如何在每个周期将数据追加到数据框 这是我使用的代码:
for file in dayfolders.collect():
filename = file.name
pathname = file.path
tablename = "Obelix"
if filename.endswith(".csv"):
df = spark.read.format("csv")\
.option("inferschema", "true")\
.option("header","true")\
.load(file.path)
continue
else:
continue
如果我在for语句之后直接放置语句print(filename),我可以看到它遍历三个文件。分别处理所有文件都很好
答案 0 :(得分:0)
您可以使用文件列表进行导入。它们会自动为您组合在一起。
csv_import = sqlContext.read\
.format('csv')\
.options(sep = ',', header='true', inferSchema='true')\
.load([file.path for file in dayfolders.collect()])\
.createOrReplaceTempView(<temporary table name>)
如果您打算将文件作为单独的数据帧读取,则需要将每个数据帧合并在一起:
for ind, file in enumerate(dayfolders.collect()):
if ind == 0:
df = spark.read.format("csv")\
.option("inferschema", "true")\
.option("header","true")\
.load(file.path)
else:
df = df.union(spark.read.format("csv")\
.option("inferschema", "true")\
.option("header","true")\
.load(file.path))
我不建议您这样做。只需使用第一种方法即可。
答案 1 :(得分:0)
您不必提供ForLoop。您可以在加载时提供“ dayfolders / *。csv”,它将直接加载所有文件并将其组合到数据帧中。
f = spark.read.format("csv")\
.option("inferschema", "true")\
.option("header","true")\
.load(dayfolders/*.csv")