Azure Synapse Polybase/外部表 - 我们可以在创建外部表时从文件中获取行号吗
Posted
技术标签:
【中文标题】Azure Synapse Polybase/外部表 - 我们可以在创建外部表时从文件中获取行号吗【英文标题】:Azure Synapse Polybase/External Tables - Can we get the line numbers from a file while we create an external table 【发布时间】:2021-11-24 15:35:48 【问题描述】:我在使用 Azure Synapse 中的 Polybase 读取文件并将其加载到表时尝试从文件中获取行号。例如,假设文件(csv)有 3 列,我需要加载具有 4 列的目标表(来自文件的 3 列和用于保存文件中行/行号的列)。有什么 polybase 属性可以用来获取这条线吗?
Sample File
Expected Output
我在从外部表中选择时尝试使用 row_number 函数,但是当数据很大时,这会给出不正确的行号(将行号混淆)。我猜这是由于概念上构建了 Azure Synapse(主/从)。
CREATE EXTERNAL TABLE dbo.EXAMPLE_EXT (
COL1 VARCHAR(5),
COL2 VARCHAR(5),
COL3 VARCHAR(5))
WITH (
LOCATION='../',
DATA_SOURCE=Example_DataSource,
FILE_FORMAT=Example_csvFile
);
INSERT INTO EXAMPLE_TARGET_TABLE (LINE_NUMBER,COL1,COL2,COL3)
SELECT ROW_NUMBER() OVER(ORDER BY NULL) AS LINE_NUMBER, COL1, COL2, COL3
FROM dbo.EXAMPLE_EXT
Output from above code
【问题讨论】:
【参考方案1】:是的,您可以使用“create table as select”添加行号。下面是一个示例脚本,如果您创建了外部数据源,则可以跳过第 1 个。
1.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE =HADOOP ]
)
[ ; ]
2.
CREATE EXTERNAL TABLE dbo.EXAMPLE_EXT (
COL1 VARCHAR(5),
COL2 VARCHAR(5),
COL3 VARCHAR(5))
WITH (
LOCATION='../',
DATA_SOURCE=Example_DataSource,
FILE_FORMAT=Example_csvFile
);
3.
CREATE TABLE EXAMPLE_TARGET_TABLE
WITH
(DISTRIBUTION = ROUND ROBIN
,CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT ROW_NUMBER() OVER(ORDER BY NULL) AS LINE_NUMBER,
*
FROM dbo.EXAMPLE_EXT;
【讨论】:
以上是关于Azure Synapse Polybase/外部表 - 我们可以在创建外部表时从文件中获取行号吗的主要内容,如果未能解决你的问题,请参考以下文章
Azure SQL 数据仓库 (Synapse Analytics) 使用 ORC 表的 Polybase 性能
将 ADLS Gen 2 中的数据加载到 Azure Synapse
Azure synapse 中的两次复制(暂存复制 + 普通复制)如何比普通复制更优化