pandas - 使用 PANDAS 代替 Spark
问题描述
背景:我正在使用 Zeppelin Notebook 进行分析。目标是使用 Pandas 数据框而不是使用 pySpark 数据框。Pandas 有一些我正在使用的统计功能。编写 .py 文件以使用示例数据文件测试所有计算等。
用例:我的数据文件(CSV 格式)有模拟数据。通常列数为 45,000。目前我有兴趣阅读前 20,000 列。行数通常为 200。
print('1 : ' , datetime.now())
sparkDF=spark.read.csv(filePath + '/' + filename,header=True,maxColumns=50000)
print('Built sparkDF with Rows: ' , sparkDF.count() , ' Column Count: ' , len(sparkDF.columns))
print('2 : ' , datetime.now())
sparkDF1 = sparkDF.select(sparkDF.columns[0:20000])
print('Built sparkDF1 with Rows: ' , sparkDF1.count() , ' Column Count: ' , len(sparkDF1.columns))
print('3 : ' , datetime.now())
exposures = sparkDF1.toPandas()
print('Built exposures with Rows: ' , exposures.shape[0] , ' Column Count: ' , exposures.shape[1])
print('4 : ' , datetime.now())
1 : 2019-10-17 16:34:06.725326
Built sparkDF with Rows: 107 Column Count: 40002
2 : 2019-10-17 16:40:04.171931
Built sparkDF1 with Rows: 107 Column Count: 20001
3 : 2019-10-17 16:51:12.465739
Built exposures with Rows: 107 Column Count: 20001
4 : 2019-10-17 16:58:25.65423
问题:
- Pandas 无法读取 HDFS 上的数据文件。
- 为了规避这个问题,我使用 spark 读取文件,然后转换为 pandas。
构建数据框的时间相当长。
我必须处理 2900 个这样的文件。需要一些建议和替代品。
解决方案
我看到您正在从文件路径读取多个文件。要优化此过程,您可以做的是读取.csv
文件的整个目录,而不是一次读取一个文件(前提是所有文件的架构都相同,看起来像您的情况):
file_path = "hdfs://path/to/multiple/files/"
df = (
spark.read.format("com.databricks.spark.csv")
.options(header="true", inferSchema="true")
.load(file_path)
)
pdf = df.toPandas()
这将在一定程度上优化您的 I/O。即使您在同一个文件夹中有 10 个文件或 200 个文件或 2900 个文件,与单独读取一个文件相比,您的读取速度也会更快。
注意:上述解决方案不适用于嵌套文件夹。
推荐阅读
- html - 关键帧开始时意外下降
- python - 从 Windows 应用程序拦截文件路径
- java - Java:如何从第二种方法中获取变量以在第三种方法中工作?
- apache-kafka - 使用 @KafkaListener 和侦听器 ack-mode 设置为记录的 Spring Kafka 轮询
- amazon-web-services - 如何从 VSCode 更新我的 AWS Lambda 函数?
- python - 在scrapy中写一个蜘蛛,但是为什么'yield item'不能在嵌套的for循环中工作?
- javascript - 将选项传递给全局注册的 vuejs 组件
- python - Python 3 lxml.Objectify
- java - 如何修复操作 switch 语句
- excel - 我想用 VBA 声明和创建一个用户表单