火花Python读取多个CSV到数据帧

时间:2020-01-23 16:10:27

标签: python dataframe databricks

我在一个数据湖上有多个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),我可以看到它遍历三个文件。分别处理所有文件都很好

2 个答案:

答案 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")