使用 pyspark 读取多个 csv 文件

Posted

技术标签:

【中文标题】使用 pyspark 读取多个 csv 文件【英文标题】:reading multiple csv files using pyspark 【发布时间】:2020-05-08 21:37:16 【问题描述】:

我需要一次读取多个 csv 文件。现在,这些 csv 文件可能具有可变数量的列并且以任何顺序排列。我们要求只读取 csv 文件中的特定列。我们如何做到这一点?我曾尝试定义自定义架构,但随后我在列中得到了不同的数据。

例如:

CSV 文件

ID、姓名、地址 如何仅选择 Id 和地址列。因为如果我说 select (Id, Address) 那么它会在 Address 列中给我 ID 和 Name 数据。我想在阅读时根据标题名称只选择 ID 和地址列。

谢谢, 导航

【问题讨论】:

【参考方案1】:

您可以遍历文件并创建最终数据框,例如:

files = ['path/to/file1.csv', 'path/to/file2.csv', 'path/to/file3.csv', 'path/to/file4.csv']

#define the output dataframe's schema column name and type should be correct
schema = t.StructType([
    t.StructField("a", t.StringType(), True), StructField("c", t.StringType(), True)
])

output_df = spark.createDataFrame([],schema)



for i,file in enumerate(data):
    df = spark.read.csv(file, header=True)
    output_df = output_df.union(df.select('a','c'))

output_df.show()

output_df 将包含您想要的输出。

【讨论】:

在读取 CSV 文件时,我们正在使用 header=True 解析文件...尝试然后分享结果 不错的解决方案..! 有什么方法可以从 csv 本身读取所需的列数,而不是遍历文件。由于我们有大约 10000 个文件,对它们进行迭代会导致非常糟糕的性能 @ShubhamJain,如您所述,如何以列表格式获取 datalake 目录中所有文件的列表。 迭代读取10000个文件的数据时性能很差。我们需要想办法只从 csv 中读取选定的列

以上是关于使用 pyspark 读取多个 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

Python pyspark 将 DF 写入 .csv 并存储在本地 C 盘

PySpark 无法从 hdfs 读取 csv:HiveExternalCatalog 错误

pyspark文件读写示例-(CSV/JSON/Parquet-单个或多个)

在 s3 pyspark 作业中创建单个镶木地板文件

在 pyspark 中以 csv 格式读取 excel 文件

在 pySpark (2.3) 中读取本地 csv 文件