我正在尝试实现 Uber 的 Petastorm 数据集创建,它利用 Spark 按照其Github 页面上的教程创建镶木地板文件。
编码:
spark = SparkSession.builder.config('spark.driver.memory', '10g').master('local[4]').getOrCreate()
sc = spark.sparkContext
with materialize_dataset(spark=spark, dataset_url='file:///opt/data/hello_world_dataset',
schema=MySchema, row_group_size_mb=256):
logging.info('Building RDD...')
rows_rdd = sc.parallelize(ids)\
.map(row_generator)\ # Generator that yields lists of examples
.flatMap(lambda x: dict_to_spark_row(MySchema, x))
logging.info('Creating DataFrame...')
spark.createDataFrame(rows_rdd, MySchema.as_spark_schema()) \
.coalesce(10) \
.write \
.mode('overwrite') \
.parquet('file:///opt/data/hello_world_dataset')
现在 RDD 代码成功执行,但只有.createDataFrame
调用失败,并出现以下错误:
_pickle.PicklingError:无法序列化广播:溢出错误:无法序列化大于 4GiB 的字符串
这是我第一次使用 Spark,所以我无法确定这个错误是源自 Spark 还是 Petastorm。
查看此错误的其他解决方案(关于 Spark,而不是 Petastorm),我发现它可能与酸洗协议有关,但我无法确认,我也没有找到改变酸洗协议的方法。
我怎样才能避免这个错误?