将 CSV 从 Blob 存储批量加载到 SQL 数据库

Bulk Loading CSV From Blob Storage to SQL Database

有很多类似的问题,但 none 似乎有我的确切问题,none 的建议解决方案对我有用。

我有一个 Azure SQL 数据库和 Azure blob 存储,我正在尝试将数据从 CSV 文件获取到现有 table(相同的数据结构、列顺序等)。

csv 文件的格式没有索引或 headers,它是从 Python 中我的 pandas 数据帧生成的,其中包含: df.to_csv(csv_path, index=False, header=False) 然后上传到 blob 存储。

我用来尝试在 SQL 中插入数据的代码是:

CREATE DATABASE SCOPED CREDENTIAL AccessAzure
WITH
     IDENTITY = 'SHARED ACCESS SIGNATURE'
,    SECRET = 'sv=<my_token>'
;

CREATE EXTERNAL DATA SOURCE GeneralBlob
WITH
(    LOCATION   = 'https://<my_storage_account>.blob.core.windows.net/general/'
,    CREDENTIAL = AccessAzure
,    TYPE       = BLOB_STORAGE
)
;

BULK INSERT <existing_table>
FROM 'data.csv' 
WITH (DATA_SOURCE = 'GeneralBlob',
      FORMAT = 'CSV')
;

除了最后一部分,一切都没有错误地运行,在那里我得到:

Cannot bulk load. The file "data.csv" does not exist or you don't have file access rights.

我已经通过以下方式测试了我的 SAS 令牌等 https://<my_storage_account>.blob.core.windows.net/general/data.csv?sv=<my_token> 就在我的浏览器中,提示下载我的 CSV。所以它确实存在,并且有了令牌我应该拥有文件访问权限,但是 none尽管如此我仍然在 SQL.

中遇到该错误

我也试过了

SELECT * FROM OPENROWSET(
   BULK 'data.csv',
   DATA_SOURCE = 'GeneralBlob',
   FORMAT = 'CSV'
   ) AS DataFile;

但它抱怨缺少格式文件,我找不到 suitable 资源来告诉我如何为我的 CSV 制作其中一个。在我看来,当批量插入不起作用时,它也不会起作用。

我非常欢迎任何帮助!!

您是否尝试过将外部数据源类型更改为 HADOOP 并且位置看起来不正确。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql?view=sql-server-ver15

"Use HADOOP when the external data source is Cloudera, Hortonworks, or Azure Blob Storage."

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql?view=sql-server-ver15#e-create-external-data-source-to-reference-azure-blob-storage

尝试-

CREATE EXTERNAL DATA SOURCE GeneralBlob WITH 
(
TYPE = HADOOP, 
LOCATION = N'wasbs://general@<my_storage_account>.blob.core.windows.net',
CREDENTIAL = AccessAzure
)             

我通过编写一些代码从我的 CSV 格式文件中获得了与 OPENROWSET 的连接。工作 SQL 代码是:

SELECT * FROM OPENROWSET(
BULK 'data.csv',
DATA_SOURCE = 'GeneralBlob',
FORMAT = 'CSV',
FORMATFILE = 'data.fmt',
FORMATFILE_DATA_SOURCE = 'GeneralBlob'
) AS DataFile;   

我编写的用于从 DataFrame 生成格式文件的 Python 函数是:

def make_fmt_file(df, filename):
    num_cols = len(df.columns))
    with open(filename, 'w') as f:
        f.write('10.0\n')
        f.write(f'{num_cols}\n')
        for i, column in enumerate(df.columns):
            dataType = 'SQLCHAR' # Only seems to work with SQLCHAR
            collation = '""'
            if i+1 < len(df.columns):
                line = f'{i+1}\t{dataType}\t0\t0\t\","\t{i+1}\t{column}\t{collation}'
            else:
                line =f'{i+1}\t{dataType}\t0\t0\t\"\r\n"\t{i+1}\t{column}\t{collation}'
            f.write(line+'\n')