Apache spark 在Spark中处理bzipped json文件?
我在S3中有大约200个文件,例如,Apache spark 在Spark中处理bzipped json文件?,apache-spark,pyspark,Apache Spark,Pyspark,我在S3中有大约200个文件,例如,a_file.json.bz2,这些文件的每一行都是json格式的记录,但有些字段是由pickle.dumps序列化的,例如datetime字段。压缩后的每个文件大约为1GB。现在我需要在Spark(实际上是pyspark)中处理这些文件,但我甚至无法取出每个记录。那么,这里的最佳实践是什么 ds.take(10)给出 [(0, u'(I551'), (6, u'(dp0'), (11, u'Vadv_id'), (19, u'p1'), (22, u
a_file.json.bz2
,这些文件的每一行都是json格式的记录,但有些字段是由pickle.dumps
序列化的,例如datetime
字段。压缩后的每个文件大约为1GB。现在我需要在Spark(实际上是pyspark)中处理这些文件,但我甚至无法取出每个记录。那么,这里的最佳实践是什么
ds.take(10)
给出
[(0, u'(I551'),
(6, u'(dp0'),
(11, u'Vadv_id'),
(19, u'p1'),
(22, u'V479883'),
(30, u'p2'),
(33, u'sVcpg_id'),
(42, u'p3'),
(45, u'V1913398'),
(54, u'p4')]
显然,拆分不是按每条记录进行的
谢谢。您可以通过访问一个文件一个文件地(而不是一行一行地)访问输入文件。然后可以使用
flatMap
解压并解析自己代码中的行。我遇到了这个问题。您可以按照Daniel的建议使用wholeTextFiles
,但在读取大文件时必须小心,因为整个文件将在处理之前加载到内存中。如果文件太大,可能会使执行器崩溃。我使用了parallelize
和flatMap
。也许是类似于
def read_fun_generator(filename):
with bz2.open(filename, 'rb') as f:
for line in f:
yield line.strip()
bz2_filelist = glob.glob("/path/to/files/*.bz2")
rdd_from_bz2 = sc.parallelize(bz2_filelist).flatMap(read_fun_generator)
事实上,这是由pickle引起的问题。通过查看压缩后的文件内容,确实
(I551
(dp0
Vadv_id
p1
V479883
p2
sVcpg_id
p3
V1913398
p4
这给我分析带来了麻烦。我知道我可以多次pick.load(file)
将对象取出,但在Spark中找不到快速解决方案,我只能逐行访问加载的文件。此外,该文件中的记录具有可变的字段和长度,这使得黑客攻击更加困难
我最终从源代码重新生成了这些
bz2
文件,因为它实际上更简单、更快。我了解到Spark和hadoop完美地支持bz2
压缩,因此无需额外操作。这对我来说很有效,只需稍加修改。我必须生成pickle.load(f)
。