【问题标题】:Reading multiple CSV files in Spark and make a DataFrame在 Spark 中读取多个 CSV 文件并制作一个 DataFrame
【发布时间】:2021-04-14 10:21:57
【问题描述】:

我正在使用以下代码读取多个 csv 文件并将它们转换为 pandas df,然后将其连接为单个 pandas df。最后再次转换为 spark DataFrame。我想跳过转换为 pandas df 部分,只想拥有 spark DataFrame。

文件路径

 abfss://xxxxxx/abc/year=2021/month=1/dayofmonth=1/hour=1/*.csv
 abfss://xxxxxx/abc/year=2021/month=1/dayofmonth=1/hour=2/*.csv
......

代码

list = []


for month in range(1,3,1):
  for day in range(1,31,1):
    for hour in range(0,24,1):
      file_location = "//xxxxxx/abc/year=2021/month="+str(month)+"/dayofmonth="+str(day)+"/hour="+str(hour)+"/*.csv"    
     
        try : 
          spark_df = spark.read.format("csv").option("header", "true").load(file_location)
          pandas_df = spark_df.toPandas()
          list.append(pandas_df)
    
    
        except AnalysisException as e:
          print(e)

final_pandas_df = pd.concat(list)
df = spark.createDataFrame(final_pandas_df)

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以加载所有文件并对分区列应用过滤器:

    df = spark.read.format("csv").option("header", "true").load("abfss://xxxxxx/abc/").filter(
        'year = 2021 and month between 1 and 2 and day between 1 and 30 and hour between 0 and 23'
    )
    
    

    【讨论】:

    • 命令一直运行,即使我尝试使用year = 2021 and month = 1 and day = 1 and hour between 0 and 10
    • 如果您有很多文件或分区,可能需要一些时间。您可以尝试将year=2021 添加到加载路径...这可能有助于减少需要扫描的分区数量。
    • 抱歉,打错字了……你是对的,应该是dayofmonth
    • 只是一个小查询,如果我想获取 2020 年 11 月至 2021 年 2 月的数据,month between 11 and 2 会起作用吗?
    • 不行,你需要分别为11/2020-12/2020和1/2021-2/2021指定两个条件
    猜你喜欢
    • 2023-04-07
    • 2019-04-03
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2014-02-14
    相关资源
    最近更新 更多