如何在更短的时间内向初始 DataFrame 添加大量列(5000~1000 列)?
Posted
技术标签:
【中文标题】如何在更短的时间内向初始 DataFrame 添加大量列(5000~1000 列)?【英文标题】:How do I add large amount of columns(5000~1000 columns) to a initial DataFrame in a very less time? 【发布时间】:2019-08-26 06:12:52 【问题描述】:我想对我创建的 pyspark 管道进行某种压力测试,并想测试输入数据帧的列(从 Hive 检索)是否增加到 2x ,5x 倍,那么管道将如何工作吗?
我尝试使用 for 循环创建数据框中已经存在的数字列的重复列:
for i in range(5000):
df = df.withcolumn('abc_'+i,df.col1)
但这需要很多时间。 有什么有效的方法吗?
【问题讨论】:
【参考方案1】:withColumn 方法可能会有一些开销,请尝试使用functions
和select
,例如:
>>> dup_cols = [F.col('col_1').alias("abc_".format(i)) for i in range(1,10)]
>>> df_duplicated = df.select(df.columns + dup_cols)
>>> df.printSchema()
root
|-- col_1: string (nullable = true)
|-- date: string (nullable = true)
|-- value: long (nullable = true)
|-- id_1: string (nullable = true)
|-- id_2: string (nullable = true)
|-- id_3: string (nullable = true)
|-- id_4: string (nullable = true)
|-- id_5: string (nullable = true)
|-- id_6: string (nullable = true)
|-- id_7: string (nullable = true)
|-- id_8: string (nullable = true)
|-- id_9: string (nullable = true)
无论如何,由于这种操作在 Spark 中是惰性计算的,我不知道大量重复的列是否可以有效地针对实际大量不同的列进行测试。如果原始数据也以列优化格式(如镶木地板)保存,这种差异可能会更大。
【讨论】:
我认为 foldLeft 比 withColumn 更成问题 仍然没有时间测试差异,但我认为这取决于数据集。可悲的是,我仍然没有时间和知识来深入研究这个:-( 但是你提供了一个答案。如果你是我的博士。我会担心的。 抱歉没时间开玩笑。我自己经历并阅读了关于 withColumn() 方法的一些问题,所以我建议尝试直接使用 select() 方法。如果您有时间,请对自己的不同方法进行测试和基准测试并分享结果,谢谢。以上是关于如何在更短的时间内向初始 DataFrame 添加大量列(5000~1000 列)?的主要内容,如果未能解决你的问题,请参考以下文章