spark.read.options(header=True, delimiter="|").csv("mycsv") PySpark 中的 3 行花费了太多时

Posted

技术标签:

【中文标题】spark.read.options(header=True, delimiter="|").csv("mycsv") PySpark 中的 3 行花费了太多时间【英文标题】:spark.read.options(header=True, delimiter="|").csv("mycsv") taking too much time for 3 rows in PySpark 【发布时间】:2021-11-09 17:10:14 【问题描述】:

我正在尝试从 PySpark 中的 csv 文件创建 DataFrame,但特定文件花费了太多时间

step1 = datetime.now()
file_path = r'csv/'
csv_data = glob.glob(file_path+'*mycsv*.txt') or glob.glob(file_path='*test*.txt')
print('-------------------------------',csv_data[0])
print(F"\nStep-1 | (datetime.now() - step1).total_seconds()\n")

step2 = datetime.now()
df = spark.read.options(header=True, delimiter="|").csv(csv_data[0]) # here it's taking time
print(F"\nStep-2 | (datetime.now() - step2).total_seconds()\n")

step3 = datetime.now()
df = subset_df(csv_header, df)
print(F"\nStep-3 | (datetime.now() - step3).total_seconds()\n")

这是给定代码的输出:

Step-1 | 0.000465

Step-2 | 3.708599

Step-3 | 0.38075

在给定的输出步骤 2 中需要 3 秒或有时需要 5 秒,在我的 csv 文件中,我只有 4 行,包括标题,任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

我会说这是正确的。 step1 仅用于获取目标文件名。

但是第 2 步实际上是第一次启动 spark 应用程序的动作方法(读取)运行。如你所知,提交一个spark作业,需要先启动一个diver,然后注册AM,申请资源,调度任务执行等等,在我们第一次运行之前有很多复杂的过程。 所以我认为第一次启动 Spark 工作花费几秒钟是正常的。

因为 step3 可能是对 df 的一些改造,一旦 spark 应用启动就不需要那么复杂了,只需要 dispatch new job 来运行就不会花费太多时间。

【讨论】:

你好@RandChen 感谢您的回复,但我正在像这样spark = SparkSession.builder.appName("test").config("spark.driver.memory", "15g").getOrCreate()spark = SparkSession.builder.appName("test").config("spark.driver.memory", "15g").getOrCreate() 这条线是启动火花驱动器还是只是为我们创建。 有什么提高代码执行速度的建议 @AnkitTiwari 用于 spark 驱动程序,该代码只是为提交作业创建了一个 SparkSession 实例,但并没有真正启动它。对于代码执行的速度,并不会像我想的那样明显提升,但如果是真正的大容量数据用例,数据处理时间可能是几个小时或几天,花几秒钟开始一个工作是可以接受的。 感谢@RandChen 提供信息。

以上是关于spark.read.options(header=True, delimiter="|").csv("mycsv") PySpark 中的 3 行花费了太多时的主要内容,如果未能解决你的问题,请参考以下文章

将读取文件的架构存储到 spark scala 中的 csv 文件中

如何防止谓词下推?

如何获取网页的header格式

Feign统一设置header

okhttpbuilder设置header

如何调整nginx和apache服务器的header限制的大小