外部表错误,列值包含逗号

问题描述 投票:0回答:1

我正在使用 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池。

谢谢 沙迪亚

hadoop azure-synapse
1个回答
0
投票

正如您所提到的,您正在使用 CSV 作为文件格式在专用 SQL 池中创建外部表。

根据 将外部表与 Synapse SQL 一起使用

enter image description here

对于专用 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

参考: 将外部表与 Synapse SQL 结合使用

正如您提到的,CSV 文件从源通过 Azure 突触管道进入 ADLS Gen2 存储。

以下是创建外部表时考虑值内的逗号的步骤:

ADLS 中的 CSV 文件具有如下所示的列。

Col1
123,456

右键单击 CSV 文件,您将看到以下选项

enter image description here

当您尝试创建 EXT 表时,您将能够更改字段终止符字符串分隔符enter image description here 接下来您可以创建

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
© www.soinside.com 2019 - 2024. All rights reserved.