Pyspark 如何将数据帧的每一行写入/写入到不同的增量表中

Pyspark 如何将数据帧的每一行写入/写入到不同的增量表中,pyspark,azure-databricks,delta-lake,Pyspark,Azure Databricks,Delta Lake,我的数据帧的每一行都有一个CSV内容 我努力将每一行保存在不同的特定表中 我相信我需要使用foreach或UDF来实现这一点,但这根本不起作用 我设法找到的所有内容就像foreach中的简单打印或使用.collect()编写的代码(我真的不想使用它) 我还找到了重新分区的方法,但这不允许我选择每一行的位置 rows = df.count() df.repartition(rows).write.csv('save-dir') 你能给我一个简单而实用的例子吗?将每一行保存为一个表是一个代价高昂的

我的数据帧的每一行都有一个CSV内容

我努力将每一行保存在不同的特定表中

我相信我需要使用foreach或UDF来实现这一点,但这根本不起作用

我设法找到的所有内容就像foreach中的简单打印或使用.collect()编写的代码(我真的不想使用它)

我还找到了重新分区的方法,但这不允许我选择每一行的位置

rows = df.count()
df.repartition(rows).write.csv('save-dir')

你能给我一个简单而实用的例子吗?

将每一行保存为一个表是一个代价高昂的操作,不推荐这样做。但是你所尝试的可以像这样实现-

df.write.format("delta").partitionBy("<primary-key-column>").save("/delta/save-dir")
df.write.format(“delta”).partitionBy(“”.save(“/delta/save dir”)

现在,每一行将保存为
.parquet
格式,您可以从每个分区创建外部表。这只有在每一行都有唯一的值,即主键的情况下才能起作用。

好吧,归根结底,这是一件非常简单的事情,但我看不到这一点

基本上,当您执行foreach并且要保存的数据帧构建在循环中时。与驱动程序不同,worker不会在保存时自动设置“/dbfs/”路径,因此如果不手动添加“/dbfs/”,它将在worker中本地保存数据


这就是我的循环不起作用的原因。

您是否尝试了
.mode(“append”).repartionBy(“ID”)
,它将为每个ID创建一个目录,然后别忘了设置模式

我没有唯一的密钥,事实上,许多行都指向同一个表。数据框中有CSV | ID列。我将使用该ID将信息保存到CSV的位置。包括表、数据库、模式和sparkSchema的名称。这就是为什么我需要一个foreach或UDF。这就是一切都失败的时候