我正在使用 Azure synapse 创建外部表。
ADLS 包含 csv 文件,列值有逗号。例如,123,456。
我尝试使用列数据类型 VARCHAR、NVARCHAR、FLOAT、DECIMAL 创建外部表。该表正在创建,但在使用 select * from 进行选择时,出现 Hadoop 异常错误。有没有办法在外部表中选择具有此类值的数据。
错误:
"message": "Failure happened on 'Source' side. ErrorCode=SqlOperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=A database operation failed with the following error: 'HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: HadoopExecutionException: Could not find a delimiter after string delimiter.',
它是synapse中专用的sql池。
谢谢 沙迪亚
正如您所提到的,您正在使用 CSV 作为文件格式在专用 SQL 池中创建外部表。
对于专用 Sql 池中的外部表创建,您将需要使用 Parquet 格式。
您可以通过以下步骤在 Synapse SQL 池中创建外部表:
创建外部数据源:
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE = HADOOP ]
)
[ ; ]
创建外部文件格式:
CREATE EXTERNAL FILE FORMAT file_format_name
WITH (
FORMAT_TYPE = PARQUET
[ , DATA_COMPRESSION = {
'org.apache.hadoop.io.compress.SnappyCodec'
| 'org.apache.hadoop.io.compress.GzipCodec' }
]);
CREATE EXTERNAL FILE FORMAT census_file_format
WITH
(
FORMAT_TYPE = PARQUET,
DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
)
创建外部表:
CREATE EXTERNAL TABLE census_external_table
(
decennialTime varchar(20),
stateName varchar(100),
countyName varchar(100),
population int,
race varchar(50),
sex varchar(10),
minAge int,
maxAge int
)
WITH (
LOCATION = '/parquet/',
DATA_SOURCE = population_ds,
FILE_FORMAT = census_file_format
)
GO
SELECT TOP 1 * FROM census_external_table
正如您提到的,CSV 文件从源通过 Azure 突触管道进入 ADLS Gen2 存储。
以下是创建外部表时考虑值内的逗号的步骤:
ADLS 中的 CSV 文件具有如下所示的列。
Col1
123,456
右键单击 CSV 文件,您将看到以下选项
当您尝试创建 EXT 表时,您将能够更改字段终止符、字符串分隔符。 接下来您可以创建
schema. TableName
这是创建外部表的脚本:
IF NOT EXISTS (SELECT * FROM sys.external_file_formats WHERE name = 'SynapseDelimitedTextFormat')
CREATE EXTERNAL FILE FORMAT [SynapseDelimitedTextFormat]
WITH ( FORMAT_TYPE = DELIMITEDTEXT ,
FORMAT_OPTIONS (
FIELD_TERMINATOR = ',',
STRING_DELIMITER = '"',
FIRST_ROW = 2,
USE_TYPE_DEFAULT = FALSE
))
GO
IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = 'folder02_dileepsynpstg_dfs_core_windows_net')
CREATE EXTERNAL DATA SOURCE [folder02_dileepsynpstg_dfs_core_windows_net]
WITH (
LOCATION = 'abfss://[email protected]'
)
GO
CREATE EXTERNAL TABLE dbo.tb1 (
[Col1] nvarchar(4000)
)
WITH (
LOCATION = 'GK.csv',
DATA_SOURCE = [folder02_dileepsynpstg_dfs_core_windows_net],
FILE_FORMAT = [SynapseDelimitedTextFormat]
)
GO
SELECT TOP 100 * FROM dbo.tb1
GO
结果:
Col1
123,456