使用 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-单个或多个)