我有一个我在pyspark尝试做的任务,我100%确定有更有效的方法来解决它。基本上,我有一个包含几百个二进制列的表,我想为每个列写出一个.csv ,其中包含该列为1的行的样本。因此,如果我有500列,我想最终得到500个不同的.csv文件。
我目前的代码是:
df = sqlContext.sql("SELECT * from table WHERE col_a = 1 LIMIT 1000" )
df = df.coalesce(1)
df.write\
.mode('overwrite')\
.option("header", "true")\
.csv("s3://my_bucket/" + col_a + "/")
正如我目前所做的那样,它只是循环遍历pyspark中的所有列并在每个列上运行该代码段。但是,这并没有利用任何EMR,因为虽然sql查询可以映射/缩减,但是写入单个csv然后必须使用单个节点,而群集的其余部分只是在那里等待。
我的问题是:有没有办法告诉spark做一些事情,比如将循环的不同迭代发送到所有节点并并行执行? (我并不是说它必须是一个字面循环,只是那个概念。)
或者,除此之外,任何人都可以想到一种创造性的,更有效的方法来完成这项任务吗?
谢谢!
注意:
1)这个目的是将这些.csv提供给python机器学习脚本,因此不能将这些写入不同的表而不是.csv文件。写一些其他类型的文件会很好,但我认为这不是重点。
2)将其作为随机样本并不重要,因此使用LIMIT
就可以了。