Apache spark PySpark foreachPartition并行写入数据库
我将数百个XML文件读入一个Spark数据框,其中每一行都包含特定事件的元数据和时间序列数据。这些行中的每一行都被转换成rdd,并被转换成具有特定键/值结构的成批文档,然后写入数据库。XML数据需要分成批Apache spark PySpark foreachPartition并行写入数据库,apache-spark,pyspark,Apache Spark,Pyspark,我将数百个XML文件读入一个Spark数据框,其中每一行都包含特定事件的元数据和时间序列数据。这些行中的每一行都被转换成rdd,并被转换成具有特定键/值结构的成批文档,然后写入数据库。XML数据需要分成批df.rdd.coalesce(20)。foreachPartition(进程分区)将顺序条目写入数据库。此外,函数进程的逻辑分区也将是连续的 您需要对def进程分区的逻辑进行多线程处理。这将加快这一进程。还可以使用df.rdd.coalesce(20).foreachPartitionAsyn
df.rdd.coalesce(20)。foreachPartition(进程分区)
将顺序条目写入数据库。此外,函数进程的逻辑分区也将是连续的
您需要对def
进程分区的逻辑进行多线程处理。这将加快这一进程。还可以使用df.rdd.coalesce(20).foreachPartitionAsync(进程分区)
虽然您在数据分发方面似乎有一些问题,但它更像是您使用的Python代码和/或服务的问题。每38MB存储73条记录21分钟看起来太长了。除非你提供更多的细节,否则可能很难帮助你。这在很多方面都是不正确的。1.foreachPartition可以同时在不同的工作进程上运行不同的分区。2.您应该尝试将分区中的行批量写入,以节省时间,为每个分区创建一个到DB的连接,并在分区结束时关闭它。
def build_documents(data):
# Make dataframe out of data tags
data = pd.DataFrame([i.split(',') for i in list(chain(*(data)))])
# Helper function to Get Batches
for batch in get_batches(data):
x = batch.T.to_dict()
yield x
def process_partition(partition):
client = document_client.DocumentClient(HOST, {'masterKey': MASTER_KEY} )
for element in partition:
generator = build_documents(element)
for batch in generator:
client.CreateDocument(collection_link + 'data', batch)
# Write to Database
df.rdd.coalesce(20).foreachPartition(process_partition)