我有一个pyspark数据框,其中包含1000列和10,000条记录(行)。 我需要通过对现有列进行一些计算来创建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.S .:我正在数据砖上运行spark,有1个驱动程序和1个工作节点,它们都具有16GB内存和8个内核。
谢谢!
答案 0 :(得分:1)
您正在做的很多事情只是创建一个执行计划。 Spark会延迟执行,直到有动作触发它为止。因此,您看到的45分钟可能来自执行已设置的所有转换。
如果要查看单个withColumn需要多长时间,请先触发类似df.count()之类的操作,然后再执行单个withColumn然后再执行另一个df.count()(以再次触发操作)。
进一步了解pyspark执行计划,转换和操作。
答案 1 :(得分:1)
不要太具体
答案 2 :(得分:0)
单行执行,而不是一个接一个
df = df.withColumn('C1001', COl1).df.withColumn('C1002', COl2).df.withColumn('C1003', COl3) ......