我正在使用 Spark 的 python api。
我有一个大文本,我用 rdd = sc.loadtxt("file.txt")
加载。
之后,我想对rdd进行mapPartitions
转换。
但是,我只能使用 python 迭代器访问每个分区中文本文件的每一行。
这不是我喜欢的数据使用方式,它会影响我的应用程序性能。
是否有其他方法可以访问每个分区上的该文本文件?
例如:获取它就像一个真正的 txt 文件,1 个字符串,其中行由\n .. 分隔
最佳答案
对于初学者,您可以使用 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 模块与生成器一起工作得很好,并且绝对没有性能损失。此外,文本文件的分区内容几乎完全取决于集群设置,而不是数据本身。可以说它不是特别有用。
关于python - Spark MapPartitions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34292308/