【发布时间】:2020-03-11 22:30:30
【问题描述】:
我有一个包含超过 60 亿行数据的 Spark RDD,我想使用它来训练深度学习模型,使用 train_on_batch。我无法将所有行都放入内存中,因此我想一次获得 10K 左右的数据,以批处理成 64 或 128 的块(取决于模型大小)。我目前正在使用 rdd.sample() 但我认为这不能保证我会得到所有行。有没有更好的方法对数据进行分区以使其更易于管理,以便我可以编写一个生成器函数来获取批次?我的代码如下:
data_df = spark.read.parquet(PARQUET_FILE)
print(f'RDD Count: {data_df.count()}') # 6B+
data_sample = data_df.sample(True, 0.0000015).take(6400)
sample_df = data_sample.toPandas()
def get_batch():
for row in sample_df.itertuples():
# TODO: put together a batch size of BATCH_SIZE
yield row
for i in range(10):
print(next(get_batch()))
【问题讨论】:
-
只是提醒你的命名是错误的,那不是 rdd 那是一个数据框。
-
另外我不相信你在使用 pandas 迭代 spark 上没有什么可取胜的,如果你在 python 中分块阅读这个会更好。
-
我更改了命名以反映它是一个数据框。我需要将数据作为 Pandas 数据框输入现有模型。
-
我想问一下为什么这个问题被否决了。我花了很多时间在谷歌上搜索如何做到这一点。如果答案是显而易见的,或者有一个记录/很好理解的机制,我会很感激一个链接,我会为浪费时间道歉。
标签: python apache-spark pyspark rdd