如何在RDD上运行筛选器功能并一次使用不同的数据框架构创建输出

时间:2019-03-23 20:55:55

标签: pyspark pyspark-sql

我正在读取带有火花的专有二进制格式(rosbags),这需要进行反序列化。完成后,我将获得具有固定数量的不同架构的数据。我想写输出文件,每个不同的模式一个。

通过按类型过滤和反序列化,我已经设法为每个模式创建一个dataFrame,但是所有原始数据都会被重复读取。

下面的示例演示了使用json.loads()作为输入并使用collect()作为输出的问题。

import json
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *

def transform(data):
    print("transforming", data)
    return json.loads(data[1])

def filter_by_type(data, type_):
    print("filtering %s == %s" % (data[0], type_))
    return data[0] == type_

spark = SparkSession.builder.getOrCreate()
sc = spark.sparkContext
sc.setLogLevel("ERROR")

dd = sc.parallelize([
    ['type1', '"string1"'],
    ['type2', '2'],
])

print(spark.createDataFrame(dd.filter(lambda x: filter_by_type(x, "type1")).map(transform), StringType()).collect())
print(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)]

0 个答案:

没有答案