为什么在pyspark中“withcolumn”要花这么长时间?

hgncfbus  于 2021-05-29  发布在  Spark
关注(0)|答案(3)|浏览(496)

我有一个pysparkDataframe,包含1000列和10000条记录(行)。我需要通过对现有列执行一些计算,再创建2000个列。

df #pyspark dataframe contaning 1000 columns and 10,000 records
df = df.withColumn('C1001', ((df['C269'] * df['C285'])/df['C41'])) #existing column names range from C1 to C1000
df = df.withColumn('C1002', ((df['C4'] * df['C267'])/df['C146']))
df = df.withColumn('C1003', ((df['C87'] * df['C134'])/df['C238']))
.
.
.
df = df.withColumn('C3000', ((df['C365'] * df['C235'])/df['C321']))

问题是,这需要太长时间,大约45分钟左右。
既然我是个新手,我想知道我做错了什么?
p、 答:我在databricks上运行spark,有1个驱动程序和1个工作节点,都有16gb内存和8个内核。
谢谢!

busg9geu

busg9geu1#

一行一行地做,而不是一个接一个地做

df = df.withColumn('C1001', COl1).df.withColumn('C1002', COl2).df.withColumn('C1003', COl3) ......
wmtdaxz3

wmtdaxz32#

不要太具体
看看第一个答案的观察结果
而且知道许多df列(也称为“非常宽的数据”)的执行计划的计算成本很高
向rdd处理转移很可能是一条可行的道路。

8hhllhi2

8hhllhi23#

你所做的很多只是制定一个执行计划。spark是懒惰的执行,直到有一个动作触发它。因此,您看到的45分钟可能是执行您设置的所有转换的时间。
如果要查看单个withcolumn需要多长时间,请触发类似df.count()或之前的操作,然后执行单个withcolumn,然后执行另一个df.count()(以再次触发操作)。
更多地了解pyspark执行计划、转换和操作。

相关问题