Pyspark 如何在RDD上运行筛选函数,并在一次过程中使用不同的数据帧模式创建输出

Pyspark 如何在RDD上运行筛选函数,并在一次过程中使用不同的数据帧模式创建输出,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我正在阅读一个带有spark的专有二进制格式(rosbags),它需要进行一些反序列化。完成后,我将使用固定数量的不同模式获取数据。我想写输出文件,每个文件对应不同的模式 通过按类型过滤和反序列化,我成功地为每个模式创建了一个数据帧,但所有原始数据都会被重复读取 下面的示例演示了将json.load()用于输入,将collect()用于输出的问题 导入json 从pyspark导入SparkContext,SparkConf 从pyspark.sql导入SparkSession 从pyspark

我正在阅读一个带有spark的专有二进制格式(rosbags),它需要进行一些反序列化。完成后,我将使用固定数量的不同模式获取数据。我想写输出文件,每个文件对应不同的模式

通过按类型过滤和反序列化,我成功地为每个模式创建了一个数据帧,但所有原始数据都会被重复读取

下面的示例演示了将
json.load()
用于输入,将
collect()
用于输出的问题

导入json
从pyspark导入SparkContext,SparkConf
从pyspark.sql导入SparkSession
从pyspark.sql.types导入*
def转换(数据):
打印(“转换”,数据)
返回json.loads(数据[1])
def过滤器(按类型)(数据,类型):
打印(“筛选%s==%s”%(数据[0],键入\))
返回数据[0]==类型_
spark=SparkSession.builder.getOrCreate()
sc=spark.sparkContext
sc.setLogLevel(“错误”)
dd=sc.parallelize([
['type1','string1'],
['type2','2'],
])
打印(spark.createDataFrame(dd.filter(lambda x:filter_by_type(x,“type1”))).map(transform),StringType()).collect())
打印(spark.createDataFrame(dd.filter(lambda x:filter_by_type(x,“type2”))).map(transform),IntegerType()).collect())
输出

filtering type1 == type1
transforming ['type1', '"string1"']
filtering type2 == type1
[Row(value='string1')]
filtering type1 == type2
filtering type2 == type2
transforming ['type2', '2']
[Row(value=2)]

我认为,除非你有办法在不解析的情况下过滤掉想要的字符串,否则你必须在每次过滤时解析所有数据。您可以在“映射(转换)”之后使用缓存(添加“.cache”),以获得更好的性能。我的示例过于简单。实际上,在反序列化之前可以进行过滤。真正的问题是原始数据集仍然会被反复读取。为了更好地反映现实情况,我对示例进行了更新。正如前面所说的,在创建RDD(dd.cache())之后,只需缓存它,这样就不会对其进行重新读取,而且重写会有问题,原始文件重达数百GiB。我认为,除非你有办法在不解析的情况下过滤掉想要的字符串,否则每次过滤时都必须解析所有数据。您可以在“映射(转换)”之后使用缓存(添加“.cache”),以获得更好的性能。我的示例过于简单。实际上,在反序列化之前可以进行过滤。真正的问题是原始数据集仍然会被反复读取。为了更好地反映现实情况,我对示例进行了更新。正如前面所说的,在创建RDD(dd.cache())之后,只需缓存它,这样就不会对其进行读取,并且覆盖会有问题,原始文件的重量为数百GiB。