【问题标题】:Create View in Polybase在 Polybase 中创建视图
【发布时间】:2019-06-29 18:47:14
【问题描述】:

我正在尝试通过 polybase 加载多个文件,并在创建视图时向我抛出错误。

select * from dbo.test

fname lname
a.csv null
b.csv null

我能够成功创建数据源和外部表,没有任何问题。

代码错误

Error in the code.
Msg 207, Level 16, State 1, Line 4
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.
Invalid column name 'DATA_FILE_NAME'.

代码

 IF OBJECT_ID('dbo.TEST_V', 'V') IS NOT NULL
DROP VIEW [dbo].[TEST_V]
GO

 -- Create new view
CREATE VIEW [dbo].[TEST_V]
AS

-- Add dynamic T-SQL to temporary table 

SELECT 

-- Auto increment number
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ROW_ID,

-- Data file name
DATA_FILE_NAME AS DATA_FILE,

-- Drop external table if it exists
'IF EXISTS (SELECT * FROM sys.external_tables WHERE NAME = ' + 
CHAR(39) + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + CHAR(39) + ') ' + 
'DROP EXTERNAL TABLE [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '];' AS DROP_STMT,

-- Create new external table
'CREATE EXTERNAL TABLE [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '] ' + 
'( ' + 
'fname [varchar] (70), ' +
'lname [varchar] (70) ' +
   ') ' + 
'WITH ' +
'( ' +
'LOCATION=' + CHAR(39) + '/NEW/' + DATA_FILE_NAME + CHAR(39) + ' ' +
', DATA_SOURCE = SIMPLE' +
', FILE_FORMAT = SIMPLE_HEADER' +
', REJECT_TYPE = VALUE ' + 
', REJECT_VALUE = 1 ' +
') ' AS CREATE_STMT,

-- Move data into staging table
'INSERT INTO dbo.fname ' + 
'SELECT ' +
'  fname ,' +
'  lname ' +
'FROM [dbo].[' + SUBSTRING(DATA_FILE_NAME, 1, LEN(DATA_FILE_NAME) - 11) + '] ' +
';' AS INSERT_STMT

FROM 
[dbo].[test];
GO

我正在尝试使用上述视图创建过程以动态使用多个文件加载数据。

【问题讨论】:

  • 所以表 dbo.test 没有名为 ... DATA_FILE_NAME 的列。
  • dbo.test 仅包含 fname 和 lname 列。
  • 您是否考虑将DATA_FILE_NAME 列添加到名为dbo.test 的表中?或者将视图中指向DATA_FILE_NAME 的所有引用更改为表中的列之一,例如fname
  • 如果我将这个 DATA_FILE_NAME 更改为 fname,那么我会得到同样的错误。

标签: azure azure-sql-database azure-blob-storage azure-sqldw polybase


【解决方案1】:

由于它们都针对同一个表,您不需要使用这种逐个文件的方法。 Polybase 将加载一组类似通配符的文件。如果您将所有相同类型的数据文件放在一个文件夹中,并将 FOLDER 设置为位置,则该文件夹中的所有文件将并行加载。您会发现您的加载速度大大加快……目前您正在串行处理文件,使用我建议的方法将尽可能快地并行处理它们。

【讨论】:

  • 感谢 Ron 的评论,但如何在 PolyBase 中实现增量负载?
  • 加载到临时表中,然后使用 WHERE NOT EXISTS 子句插入到目标表中。更好的方法可能是将 CTAS 从旧表的联合中放入一个新表,并从新表中放入一个 WHERE NOT EXISTS。
  • 你的意思是说,如果我有一个每日文件 a_02_05_19.txt 和 a_02_06_19.txt。您的意思是说将两个文件都加载到临时表中,然后从外部表中仅选择今天的数据并加载到永久表中。
  • 不,如果我不清楚,对不起。将所有文件放入文件夹“a”中。将此设置为您的外部数据源。一条 CTAS 语句会将此文件夹中的所有文件加载到临时表中。然后 CTAS 或将临时表中的行插入到永久表中,使用 WHERE NOT EXISTS 子句忽略该永久表中已经存在的行。
  • 感谢罗恩的回复。假设我有 100 个文件,每个文件包含 100 万条记录。如果我已经加载了 99 个文件并且如果我需要插入第 100 个文件,那么我们是否需要加载所有 100 个文件并从临时表中删除 99 个文件记录并将其加载到永久表中。在这种情况下,性能如何?
猜你喜欢
  • 2020-03-16
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多