Spark MapPartitions

时间:2015-12-15 14:53:46

标签: python apache-spark pyspark

我正在使用Spark的python api 我有一个大文本,我加载Qt
之后,我想在rdd上进行rdd = sc.loadtxt("file.txt")转换 但是,我只能使用python迭代器访问每个分区中文本文件的每一行。
这不是我喜欢使用数据的方式,而是我的应用程序性能成本。

是否有其他方法可以在每个分区上访问该文本文件?
例如:将其变为真正的txt文件,1个字符串,其中行由\ n分隔。

1 个答案:

答案 0 :(得分:2)

对于初学者,您可以使用glom方法将每个分区中的所有元素合并到一个列表中

rdd = sc.parallelize(range(50), 5).map(str)
glomed = rdd.glom()

这意味着您将获得仅包含单个元素的生成器。接下来,您可以简单地加入行:

def do_something(iter):
    s = "\n".join(next(iter))  # For Python 2 use iter.next()
    # ... do something with s
    return ...

glomed.mapPartitions(do_something)

更简单的方法是省略glom并简单地连接行:

rdd.mapPartitions(lambda iter: ["\n".join(iter)]).first()
"0\n1\n2\n3\n4\n5\n6\n7\n8\n9'

注意

一般来说,没有必要这样做。大多数Python模块都可以很好地使用生成器,并且绝对没有性能损失。此外,在文本文件的情况下,分区的内容几乎完全取决于群集设置而不是数据本身。可以说它不是特别有用。