我想在我的ML模型(使用PySpark和Spark Pipeline实现)上进行“压力测试”,并查看如果将输入数据集中的特征数量加倍/增加三倍,它的性能如何。
例如,以这个DF:
bar()
并使其如下:
+-------+-------+-----+------+
| _c0| _c1| _c2| _c3|
+-------+-------+-----+------+
| 1 |Testing| | true |
+-------+-------+-----+------+
最简单的方法如下:
+-------+-------+-----+------+-------+-------+-----+------+
| _c0| _c1| _c2| _c3| _c4| _c5| _c6| _c7|
+-------+-------+-----+------+-------+-------+-----+------+
| 1 |Testing| | true | 1 |Testing| | true |
+-------+-------+-----+------+-------+-------+-----+------+
但是,这需要很多时间。
任何解决方案,我都将不胜感激,甚至可以解释为什么这种解决方案更好。
非常感谢您!
答案 0 :(得分:2)
您可以使用selectExpr()
进行此操作。星号*
将un-list
变成list
。
例如; *['_c0', '_c1', '_c2', '_c3']
将返回'_c0', '_c1', '_c2', '_c3'
在list-comprehensions
的帮助下,此代码可以被广泛推广。
df = sqlContext.createDataFrame([(1,'Testing','',True)],('_c0','_c1','_c2','_c3'))
df.show()
+---+-------+---+----+
|_c0| _c1|_c2| _c3|
+---+-------+---+----+
| 1|Testing| |true|
+---+-------+---+----+
col_names = df.columns
print(col_names)
['_c0', '_c1', '_c2', '_c3']
df = df.selectExpr(*[i for i in col_names],*[i+' as '+i+'_dup' for i in col_names])
df.show()
+---+-------+---+----+-------+-------+-------+-------+
|_c0| _c1|_c2| _c3|_c0_dup|_c1_dup|_c2_dup|_c3_dup|
+---+-------+---+----+-------+-------+-------+-------+
| 1|Testing| |true| 1|Testing| | true|
+---+-------+---+----+-------+-------+-------+-------+
注意:以下代码也可以使用。
df = df.selectExpr('*',*[i+' as '+i+'_dup' for i in col_names])