使用集群列存储索引和PK/FK将spark df写入Azure SQL Server

rqenqsqc  于 2023-08-06  发布在  Apache
关注(0)|答案(1)|浏览(120)

考虑以下用例:我想使用Microsoft的Apache Spark SQL Connector将Spark Dataframe 写入存储在Azure SQL Server数据库中的dwh。根据使用情况,可以使用“覆盖”或“追加”。
对于DWH,建议使用聚集列存储索引。由于我还希望强制执行主键约束,聚集列存储索引上的非聚集索引可能会产生最佳性能。
如何使用此索引设计创建或追加到带有pyspark的表?

df.write \
        .format("com.microsoft.sqlserver.jdbc.spark") \
        .mode("overwrite OR append") \
        .option("url", url) \
        .option("dbtable", table_name) \
        .option("user", sqldbuser) \
        .option("password", sqldbpwd)

字符串
答案不必是纯粹基于pyspark的(例如可以使用SQLAlchemy)。它应该只是工作强劲。

c3frrgcw

c3frrgcw1#

最好的方法是将 Dataframe 从pyspark插入到Azure SQL Server上的staging表中(覆盖),然后使用存储过程将数据插入到columnstore索引dwh表中。
在存储过程中,使用类似这样的内容:

insert into dwh_table
    select *
    from stg_table

字符串
此外,尝试一次插入多行,以便columnstore索引可以有效地压缩它(超过1,048,576行)。
关于nonclusterd索引-如果您需要它作为主键,以防止重复,那么您别无选择,只能在加载期间将其激活。
如果没有,请尝试在加载前禁用非聚集索引(在存储过程中),并在加载后启用它们。请注意,这并不总是给予你最好的性能,你必须测试它与您的工作负载。
请参阅本文件:https://learn.microsoft.com/en-us/sql/relational-databases/indexes/columnstore-indexes-data-loading-guidance?view=sql-server-ver16

相关问题