Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Python 如何使用pyspark从Spark获取批行_Python_Apache Spark_Pyspark_Rdd - Fatal编程技术网

Python 如何使用pyspark从Spark获取批行

Python 如何使用pyspark从Spark获取批行,python,apache-spark,pyspark,rdd,Python,Apache Spark,Pyspark,Rdd,我有一个超过60亿行数据的Spark RDD,我想用它来训练一个深度学习模型,使用批量训练。我无法将所有行放入内存中,因此我希望每次获得10K左右的数据,以批处理为64或128个数据块(取决于型号大小)。我目前正在使用rdd.sample(),但我认为这并不能保证我将获得所有行。是否有更好的方法对数据进行分区,使其更易于管理,以便我可以编写用于获取批处理的生成器函数?我的代码如下: data_df = spark.read.parquet(PARQUET_FILE) print(f'RDD Co

我有一个超过60亿行数据的Spark RDD,我想用它来训练一个深度学习模型,使用批量训练。我无法将所有行放入内存中,因此我希望每次获得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()))

我不相信spark会让你抵消或分页你的数据

但您可以添加索引,然后对其进行分页,首先:

来自pyspark.sql.functions的

data\u df=spark.read.parquet(parquet\u文件)
count=数据_df.count()
区块大小=10000
#只是为ID添加一列
df_new_schema=data_df.with column('pres_id',lit(1))
#将ID添加到rdd
rdd_与_index=data_df.rdd.zipWithIndex().map(lambda(行,rowId):(列表(行)+[rowId+1]))
#使用索引创建数据帧
df_with_index=spark.createDataFrame(chunk_rdd,schema=df_new_schema.schema)
#迭代到块中
对于范围内的块大小(0,计数+1,块大小):
初始页面=页面数量*区块大小
最终页面=初始页面+区块大小
其中,查询=('pres\u id>{0}和pres\u id请尝试以下操作:

 from pyspark.sql import functions as F
 sample_dict = {}

 # Read the parquet file
 df = spark.read.parquet("parquet file")

 # add the partition_number as a column
 df = df.withColumn('partition_num', F.spark_partition_id())
 df.persist()

 total_partition = [int(row.partition_num) for row in 
 df.select('partition_num').distinct().collect()]

 for each_df in total_partition:
     sample_dict[each_df] = df.where(df.partition_num == each_df) 

我知道您正计划培训一个深度学习模型。看看Petastorm开源库,它正是为这个用例创建的


是一个开源数据访问库。该库支持直接从Apache Parquet格式的数据集和已加载为Apache Spark数据帧的数据集对深度学习模型进行单节点或分布式培训和评估。Petastorm支持流行的基于Python的机器学习(ML)Tensorflow、PyTorch和PySpark等框架。有关Petastorm的更多信息,请参阅Petastorm GitHub页面和。

请注意,您的命名是错误的,这不是rdd,这是一个数据框架。此外,我不认为您在使用pandas迭代spark方面没有任何优势,如果您在2013年在python中阅读这篇文章会更好ks。我更改了命名以反映它是一个数据帧。我需要将数据作为熊猫数据帧输入现有模型。我想问一下为什么这个问题被否决。我已经花了很多时间在谷歌上搜索如何做到这一点。如果答案是显而易见的,或者有一个记录在案的/很好理解的机制,我希望有一个链接,并且我我会为浪费时间道歉。