有许多与此类似的问题,但似乎没有一个确切的问题,也没有建议的解决方案对我有用。
我有一个Azure SQL数据库和Azure Blob存储,正在尝试将数据从CSV文件获取到现有表中(相同的数据结构,列顺序等)。
csv文件的格式没有索引或标头,并且是通过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.
我已经通过https://<my_storage_account>.blob.core.windows.net/general/data.csv?sv=<my_token>
仅在浏览器中传递来测试了SAS令牌等,然后提示下载CSV。因此它确实存在,并且使用令牌,我应该具有文件访问权限,但是尽管如此,我仍然在SQL中遇到该错误。
我也尝试过
SELECT * FROM OPENROWSET(
BULK 'data.csv',
DATA_SOURCE = 'GeneralBlob',
FORMAT = 'CSV'
) AS DataFile;
但它抱怨缺少格式文件,而且我找不到合适的资源来告诉我如何为CSV文件制作其中之一。在我看来,当批量插入仍然无法执行时,这种方法也不起作用。
我真的很欢迎任何帮助!
我通过编写一些代码以使用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')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句