基于过滤查询,从spark中有效地编写csv

时间:2017-12-05 14:43:14

标签: apache-spark pyspark pyspark-sql

我有一个我在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就可以了。

0 个答案:

没有答案