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

时间:2019-06-28 17:52:26

标签: pyspark azure-databricks delta-lake

数据框的每一行都有CSV内容。

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

我相信我需要使用foreach或UDF来完成此操作,但这根本行不通。

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

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

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

您能给我一个简单而可行的例子吗?

3 个答案:

答案 0 :(得分:0)

将每一行保存为表是一项昂贵的操作,不建议这样做。但是,您正在尝试的目标可以这样实现-

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

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

答案 1 :(得分:0)

总之,一如既往,这很简单,但我看不出有任何问题。

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

这就是为什么我的循环无法正常工作的原因。

答案 2 :(得分:0)

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