我正在使用Spark的python api
我有一个大文本,我加载Qt
。
之后,我想在rdd上进行rdd = sc.loadtxt("file.txt")
转换
但是,我只能使用python迭代器访问每个分区中文本文件的每一行。
这不是我喜欢使用数据的方式,而是我的应用程序性能成本。
是否有其他方法可以在每个分区上访问该文本文件?
例如:将其变为真正的txt文件,1个字符串,其中行由\ n分隔。
答案 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模块都可以很好地使用生成器,并且绝对没有性能损失。此外,在文本文件的情况下,分区的内容几乎完全取决于群集设置而不是数据本身。可以说它不是特别有用。