Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在Spark中处理bzipped json文件?_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 在Spark中处理bzipped json文件?

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

我在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'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)