CREATE EXTERNAL TABLE (Transact-SQL)CREATE EXTERNAL TABLE (Transact-SQL)

Crea una tabella esternaCreates an external table

Questo articolo fornisce la sintassi, gli argomenti, la sezione Osservazioni, le autorizzazioni ed esempi per qualsiasi prodotto SQL scelto.This article provides the syntax, arguments, remarks, permissions, and examples for whichever SQL product you choose.

Per altre informazioni sulle convenzioni di sintassi, vedere Convenzioni della sintassi Transact-SQL.For more information about the syntax conventions, see Transact-SQL Syntax Conventions.

Selezionare un prodottoSelect a product

Nella riga seguente selezionare il nome del prodotto a cui si è interessati. Verranno visualizzate solo le informazioni per tale prodotto.In the following row, select the product name you're interested in, and only that product’s information is displayed.

* SQL Server *  * SQL Server *  

 

Panoramica: SQL ServerOverview: SQL Server

Questo comando crea una tabella esterna per l'accesso di PolyBase ai dati archiviati in un cluster Hadoop o in una tabella esterna PolyBase di Archiviazione BLOB di Azure che fa riferimento ai dati archiviati in un cluster Hadoop o in Archiviazione BLOB di Azure.This command creates an external table for PolyBase to access data stored in a Hadoop cluster or Azure blob storage PolyBase external table that references data stored in a Hadoop cluster or Azure blob storage.

SI APPLICA A: SQL Server 2016 (o versione successiva)APPLIES TO: SQL Server 2016 (or higher)

Usa una tabella esterna con un'origine dati esterna per le query PolyBase.Use an external table with an external data source for PolyBase queries. Le origini dati esterne vengono usate per stabilire la connettività e supportano questi casi d'uso principali:External data sources are used to establish connectivity and support these primary use cases:

  • Virtualizzazione dati e caricamento dati con PolyBaseData virtualization and data load using PolyBase
  • Operazioni di caricamento bulk con SQL Server o database SQL con BULK INSERT o OPENROWSETBulk load operations using SQL Server or SQL Database using BULK INSERT or OPENROWSET

Vedere anche CREATE EXTERNAL DATA SOURCE e DROP EXTERNAL TABLE.See also CREATE EXTERNAL DATA SOURCE and DROP EXTERNAL TABLE.

SintassiSyntax

-- Create a new external table
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ ,...n ] )
    WITH (
        LOCATION = 'folder_or_filepath',
        DATA_SOURCE = external_data_source_name,
        FILE_FORMAT = external_file_format_name
        [ , <reject_options> [ ,...n ] ]
    )
[;]

<reject_options> ::=
{
    | REJECT_TYPE = value | percentage
    | REJECT_VALUE = reject_value
    | REJECT_SAMPLE_VALUE = reject_sample_value
}

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

ArgomentiArguments

{ database_name.schema_name.table_name | schema_name.table_name | table_name } è il nome della tabella da creare, composto da una, due o tre parti.{ database_name.schema_name.table_name | schema_name.table_name | table_name } The one to three-part name of the table to create. Per una tabella esterna, solo i metadati della tabella vengono archiviati in SQL insieme alle statistiche di base relative al file o alla cartella a cui viene fatto riferimento in Hadoop o nell'archiviazione BLOB di Azure.For an external table, SQL stores only the table metadata along with basic statistics about the file or folder that is referenced in Hadoop or Azure blob storage. I dati effettivi non vengono spostati o archiviati in SQL ServerSQL Server.No actual data is moved or stored in SQL ServerSQL Server.

Importante

Per ottenere prestazioni ottimali, se il driver dell'origine dati esterna supporta un nome in tre parti, è consigliabile specificare il nome in tre parti.For best performance, if the external data source driver supports a three-part name, it is strongly recommended to provide the three-part name.

<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supporta la possibilità di configurare il nome di colonna, il tipo di dati, il supporto dei valori Null e le regole di confronto.<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supports the ability to configure column name, data type, nullability and collation. Non è possibile usare DEFAULT CONSTRAINT nelle tabelle esterne.You can't use the DEFAULT CONSTRAINT on external tables.

Le definizioni di colonna, inclusi i tipi di dati e il numero di colonne, devono corrispondere ai dati nei file esterni.The column definitions, including the data types and number of columns, must match the data in the external files. In caso di mancata corrispondenza, le righe di file verranno rifiutate quando si eseguono query sui dati effettivi.If there's a mismatch, the file rows will be rejected when querying the actual data.

LOCATION = 'folder_or_filepath' specifica la cartella o il percorso e il nome file per i dati effettivi in Hadoop o Archiviazione BLOB di Azure.LOCATION = 'folder_or_filepath' Specifies the folder or the file path and file name for the actual data in Hadoop or Azure blob storage. Il percorso inizia dalla cartella radice.The location starts from the root folder. La cartella radice è il percorso dei dati specificato nell'origine dati esterna.The root folder is the data location specified in the external data source.

In SQL Server l'istruzione CREATE EXTERNAL TABLE crea il percorso e la cartella, se non esiste già.In SQL Server, the CREATE EXTERNAL TABLE statement creates the path and folder if it doesn't already exist. Quindi è possibile usare INSERT INTO per esportare i dati da una tabella di SQL Server locale a un'origine dati esterna.You can then use INSERT INTO to export data from a local SQL Server table to the external data source. Per altre informazioni, vedere l'articolo relativo alle query di PolyBase.For more information, see PolyBase Queries.

Se si specifica che LOCATION deve essere una cartella, una query PolyBase che effettua selezioni dalla tabella esterna recupererà i file dalla cartella e da tutte le relative sottocartelle.If you specify LOCATION to be a folder, a PolyBase query that selects from the external table will retrieve files from the folder and all of its subfolders. Proprio come Hadoop, PolyBase non restituisce le cartelle nascoste.Just like Hadoop, PolyBase doesn't return hidden folders. Inoltre, non restituisce i file il cui nome file inizia con un carattere di sottolineatura () o un punto (.).It also doesn't return files for which the file name begins with an underline () or a period (.).

In questo esempio, se LOCATION='/webdata/', una query PolyBase restituisce le righe da mydata.txt e mydata2.txt.In this example, if LOCATION='/webdata/', a PolyBase query will return rows from mydata.txt and mydata2.txt. Non restituirà mydata3.txt perché è un file in una cartella nascosta.It won't return mydata3.txt because it's a file in a hidden folder. Non restituirà _hidden.txt perché è un file nascosto.And it won't return _hidden.txt because it's a hidden file.

Dati ricorsivi per tabelle esterneRecursive data for external tables

Per modificare l'impostazione predefinita e leggere solo dalla directory radice, impostare l'attributo <polybase.recursive.traversal> su 'false' nel file di configurazione core-site.xml.To change the default and only read from the root folder, set the attribute <polybase.recursive.traversal> to 'false' in the core-site.xml configuration file. Questo file si trova in <SqlBinRoot>\PolyBase\Hadoop\Conf with SqlBinRoot the bin root of SQl Server.This file is located under <SqlBinRoot>\PolyBase\Hadoop\Conf with SqlBinRoot the bin root of SQl Server. Ad esempio: C:\\Program Files\\Microsoft SQL Server\\MSSQL13.XD14\\MSSQL\\Binn.For example, C:\\Program Files\\Microsoft SQL Server\\MSSQL13.XD14\\MSSQL\\Binn.

DATA_SOURCE = external_data_source_name specifica il nome dell'origine dati esterna che contiene il percorso dei dati esterni.DATA_SOURCE = external_data_source_name Specifies the name of the external data source that contains the location of the external data. Questo percorso è un file system Hadoop (HDFS), un contenitore BLOB del servizio di archiviazione di Azure o Azure Data Lake Store.This location is a Hadoop File System (HDFS), an Azure storage blob container, or Azure Data Lake Store. Per creare un'origine dati esterna, usare CREATE EXTERNAL DATA SOURCE.To create an external data source, use CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name specifica il nome dell'oggetto formato di file esterno che contiene il tipo di file e il metodo di compressione per i dati esterni.FILE_FORMAT = external_file_format_name Specifies the name of the external file format object that stores the file type and compression method for the external data. Per creare un formato di file esterno, usare CREATE EXTERNAL FILE FORMAT.To create an external file format, use CREATE EXTERNAL FILE FORMAT.

Le opzioni REJECT consentono di specificare i parametri di rifiuto che determinano il modo in cui PolyBase gestirà i record dirty recuperati dall'origine dati esterna.Reject Options You can specify reject parameters that determine how PolyBase will handle dirty records it retrieves from the external data source. Un record di dati è considerato "dirty" se i tipi di dati effettivi o il numero di colonne non corrispondono alle definizioni di colonna della tabella esterna.A data record is considered 'dirty' if it actual data types or the number of columns don't match the column definitions of the external table.

Se non si specificano o si modificano i valori di rifiuto, PolyBase usa i valori predefiniti.When you don't specify or change reject values, PolyBase uses default values. Queste informazioni sui parametri di rifiuto vengono archiviate come metadati aggiuntivi quando si crea una tabella esterna con l'istruzione CREATE EXTERNAL TABLE.This information about the reject parameters is stored as additional metadata when you create an external table with CREATE EXTERNAL TABLE statement. Quando un'istruzione SELECT o SELECT INTO SELECT futura seleziona i dati dalla tabella esterna, PolyBase usa le opzioni di rifiuto per determinare il numero o la percentuale di righe che possono essere rifiutate prima che la query effettiva abbia esito negativo.When a future SELECT statement or SELECT INTO SELECT statement selects data from the external table, PolyBase will use the reject options to determine the number or percentage of rows that can be rejected before the actual query fails. La query restituirà risultati (parziali) finché non viene superata la soglia di rifiuto,The query will return (partial) results until the reject threshold is exceeded. quindi ha esito negativo con il messaggio di errore appropriato.It then fails with the appropriate error message.

REJECT_TYPE = value | percentage indica se l'opzione REJECT_VALUE è specificata come valore letterale o percentuale.REJECT_TYPE = value | percentage Clarifies whether the REJECT_VALUE option is specified as a literal value or a percentage.

L'opzione REJECT_VALUE di tipo value indica un valore letterale, non una percentuale.value REJECT_VALUE is a literal value, not a percentage. La query PolyBase avrà esito negativo se il numero di righe rifiutate supera reject_value.The PolyBase query will fail when the number of rejected rows exceeds reject_value.

Ad esempio, se REJECT_VALUE = 5 e REJECT_TYPE = value, la query SELECT di PolyBase avrà esito negativo dopo che sono state rifiutate cinque righe.For example, if REJECT_VALUE = 5 and REJECT_TYPE = value, the PolyBase SELECT query will fail after five rows have been rejected.

L'opzione REJECT_VALUE di tipo percentage indica una percentuale, non un valore letterale.percentage REJECT_VALUE is a percentage, not a literal value. La query PolyBase avrà esito negativo se la percentuale di righe non eseguite supera il valore reject_value.A PolyBase query will fail when the percentage of failed rows exceeds reject_value. La percentuale di righe con esito negativo viene calcolata a intervalli.The percentage of failed rows is calculated at intervals.

REJECT_VALUE = reject_value specifica il valore o la percentuale di righe che possono essere rifiutate prima che la query abbia esito negativo.REJECT_VALUE = reject_value Specifies the value or the percentage of rows that can be rejected before the query fails.

Per REJECT_TYPE = value, reject_value deve essere un numero intero compreso tra 0 e 2.147.483.647.For REJECT_TYPE = value, reject_value must be an integer between 0 and 2,147,483,647.

Per REJECT_TYPE = percentage, reject_value deve essere un valore float compreso tra 0 e 100.For REJECT_TYPE = percentage, reject_value must be a float between 0 and 100.

REJECT_SAMPLE_VALUE = reject_sample_value è un attributo obbligatorio quando si specifica REJECT_TYPE = percentage.REJECT_SAMPLE_VALUE = reject_sample_value This attribute is required when you specify REJECT_TYPE = percentage. Determina il numero di righe che si deve tentare di recuperare prima che PolyBase ricalcoli la percentuale di righe rifiutate.It determines the number of rows to attempt to retrieve before the PolyBase recalculates the percentage of rejected rows.

Il parametro reject_sample_value deve essere un numero intero compreso tra 0 e 2.147.483.647.The reject_sample_value parameter must be an integer between 0 and 2,147,483,647.

Ad esempio, se REJECT_SAMPLE_VALUE = 1000, PolyBase calcola la percentuale di righe con esito negativo dopo che ha tentato di importare 1000 righe dal file di dati esterno.For example, if REJECT_SAMPLE_VALUE = 1000, PolyBase will calculate the percentage of failed rows after it has attempted to import 1000 rows from the external data file. Se la percentuale di righe con esito negativo è inferiore al valore reject_value, PolyBase tenterà di recuperare altre 1000 righe.If the percentage of failed rows is less than reject_value, PolyBase will attempt to retrieve another 1000 rows. Continua a ricalcolare la percentuale di righe con esito negativo dopo aver tentato di importare ognuna delle 1000 righe aggiuntive.It continues to recalculate the percentage of failed rows after it attempts to import each additional 1000 rows.

Nota

Poiché PolyBase calcola la percentuale di righe con esito negativo a intervalli, la percentuale effettiva di tali righe può superare reject_value.Since PolyBase computes the percentage of failed rows at intervals, the actual percentage of failed rows can exceed reject_value.

Esempio:Example:

Questo esempio illustra come le tre opzioni REJECT interagiscono tra loro.This example shows how the three REJECT options interact with each other. Ad esempio, se REJECT_TYPE = percentage, REJECT_VALUE = 30 e REJECT_SAMPLE_VALUE = 100, potrebbe verificarsi il seguente scenario:For example, if REJECT_TYPE = percentage, REJECT_VALUE = 30, and REJECT_SAMPLE_VALUE = 100, the following scenario could occur:

  • PolyBase tenta di recuperare le prime 100 righe di cui 25 avranno esito negativo e 75 esito positivo.PolyBase attempts to retrieve the first 100 rows; 25 fail and 75 succeed.
  • La percentuale di righe con esito negativo viene calcolata come 25%, che è minore del valore di rifiuto pari al 30%.Percent of failed rows is calculated as 25%, which is less than the reject value of 30%. Di conseguenza, PolyBase continuerà a recuperare i dati dall'origine dati esterna.As a result, PolyBase will continue retrieving data from the external data source.
  • PolyBase tenta di caricare le 100 righe successive: questa volta 25 righe hanno esito positivo e 75 righe hanno esito negativo.PolyBase attempts to load the next 100 rows; this time 25 rows succeed and 75 rows fail.
  • Percentuale di righe con esito negativo viene ricalcolata come 50%.Percent of failed rows is recalculated as 50%. La percentuale di righe con esito negativo ha superato il valore di rifiuto del 30%.The percentage of failed rows has exceeded the 30% reject value.
  • La query PolyBase ha esito negativo con il 50% di righe rifiutate dopo aver tentato di restituire le prime 200 righe.The PolyBase query fails with 50% rejected rows after attempting to return the first 200 rows. Si noti che le righe corrispondenti vengono restituite prima che la query PolyBase rilevi che è stata superata la soglia di rifiuto.Notice that matching rows have been returned before the PolyBase query detects the reject threshold has been exceeded.

SCHEMA_NAME La clausola SCHEMA_NAME consente di eseguire il mapping della definizione di tabella esterna a una tabella in uno schema diverso nel database remoto.SCHEMA_NAME The SCHEMA_NAME clause provides the ability to map the external table definition to a table in a different schema on the remote database. Usare questa clausola per evitare ambiguità tra gli schemi che esistono sia nei database locali che in quelli remoti.Use this clause to disambiguate between schemas that exist on both the local and remote databases.

OBJECT_NAME La clausola OBJECT_NAME consente di eseguire il mapping della definizione di tabella esterna a una tabella con un nome diverso nel database remoto.OBJECT_NAME The OBJECT_NAME clause provides the ability to map the external table definition to a table with a different name on the remote database. Usare questa clausola per evitare ambiguità tra i nomi oggetto che esistono sia nei database locali che in quelli remoti.Use this clause to disambiguate between object names that exist on both the local and remote databases.

DISTRIBUTION Facoltativo.DISTRIBUTION Optional. Questo argomento è obbligatorio solo per i database di tipo SHARD_MAP_MANAGER.This argument is only required for databases of type SHARD_MAP_MANAGER. Questo argomento verifica se una tabella viene trattata come una tabella partizionata o una tabella replicata.This argument controls whether a table is treated as a sharded table or a replicated table. Con le tabelle SHARDED (nome colonna), i dati provenienti da tabelle diverse non si sovrappongono.With SHARDED (column name) tables, the data from different tables don't overlap. REPLICATED specifica che le tabelle devono avere gli stessi dati in ogni partizione.REPLICATED specifies that tables have the same data on every shard. ROUND_ROBIN indica che viene usato un metodo specifico di un'applicazione per distribuire i dati.ROUND_ROBIN indicates that an application-specific method is used to distribute the data.

AutorizzazioniPermissions

Richiede queste autorizzazioni utente:Requires these user permissions:

  • CREATE TABLECREATE TABLE
  • ALTER ANY SCHEMAALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMATALTER ANY EXTERNAL FILE FORMAT
  • CONTROL DATABASECONTROL DATABASE

Si noti che l'account di accesso che crea l'origine dati esterna deve avere le autorizzazioni necessarie per leggere e scrivere nell'origine dati esterna, che si trova in Hadoop o nell'archiviazione BLOB di Azure.Note, the login that creates the external data source must have permission to read and write to the external data source, located in Hadoop or Azure blob storage.

Importante

L'autorizzazione ALTER ANY EXTERNAL DATA SOURCE concede a qualsiasi entità di sicurezza la possibilità di creare e modificare qualsiasi oggetto origine dati esterna e, di conseguenza, la possibilità di accedere a tutte le credenziali con ambito database nel database.The ALTER ANY EXTERNAL DATA SOURCE permission grants any principal the ability to create and modify any external data source object, and therefore, it also grants the ability to access all database scoped credentials on the database. Questa autorizzazione deve essere considerata con privilegi elevati e quindi essere concessa solo a entità attendibili nel sistema.This permission must be considered as highly privileged, and therefore must be granted only to trusted principals in the system.

Gestione degli erroriError Handling

Durante l'esecuzione dell'istruzione CREATE EXTERNAL TABLE, PolyBase tenta di connettersi all'origine dati esterna.While executing the CREATE EXTERNAL TABLE statement, PolyBase attempts to connect to the external data source. Se il tentativo di connessione non riesce, l'istruzione ha esito negativo e la tabella esterna non viene creata.If the attempt to connect fails, the statement will fail and the external table won't be created. La conferma dell'esito negativo del comando può richiedere almeno un minuto perché PolyBase ritenta la connessione prima di stabilire che la query non riesce.It can take a minute or more for the command to fail since PolyBase retries the connection before eventually failing the query.

Osservazioni generaliGeneral Remarks

Negli scenari di query ad hoc, ad esempio SELECT FROM EXTERNAL TABLE, PolyBase archivia le righe recuperate dall'origine dati esterna in una tabella temporanea.In ad-hoc query scenarios, such as SELECT FROM EXTERNAL TABLE, PolyBase stores the rows that are retrieved from the external data source in a temporary table. Dopo il completamento della query, PolyBase rimuove ed elimina la tabella temporanea.After the query completes, PolyBase removes and deletes the temporary table. Nessun dato permanente viene archiviato nelle tabelle SQL.No permanent data is stored in SQL tables.

Al contrario, nello scenario di importazione, ad esempio SELECT INTO FROM EXTERNAL TABLE, PolyBase archivia le righe recuperate dall'origine dati esterna come dati permanenti nella tabella SQL.In contrast, in the import scenario, such as SELECT INTO FROM EXTERNAL TABLE, PolyBase stores the rows that are retrieved from the external data source as permanent data in the SQL table. La nuova tabella viene creata durante l'esecuzione della query quando PolyBase recupera i dati esterni.The new table is created during query execution when PolyBase retrieves the external data.

PolyBase può eseguire il push di parte del calcolo della query in Hadoop per migliorare le prestazioni della query.PolyBase can push some of the query computation to Hadoop to improve query performance. Questa operazione è chiamata distribuzione del predicato.This action is called predicate pushdown. Per abilitarla, specificare l'opzione del percorso della gestione risorse di Hadoop in CREATE EXTERNAL DATA SOURCE.To enable it, specify the Hadoop resource manager location option in CREATE EXTERNAL DATA SOURCE.

È possibile creare numerose tabelle esterne che fanno riferimento alle stesse o ad altre origini dati esterne.You can create many external tables that reference the same or different external data sources.

Limitazioni e restrizioniLimitations and Restrictions

Non essendo sotto il controllo di gestione diretto di SQL Server, i dati per una tabella possono essere modificati o rimossi in qualsiasi momento da un processo esterno.Since the data for an external table is not under the direct management control of SQL Server, it can be changed or removed at any time by an external process. Per questo motivo, non si garantisce che i risultati delle query in una tabella esterna siano deterministici.As a result, query results against an external table aren't guaranteed to be deterministic. La stessa query può restituire risultati diversi ogni volta che viene eseguita su una tabella esterna.The same query can return different results each time it runs against an external table. Analogamente, una query può non riuscire se i dati esterni vengono spostati o rimossi.Similarly, a query might fail if the external data is moved or removed.

È possibile creare più tabelle esterne che fanno tutte riferimento a origini dati esterne differenti.You can create multiple external tables that each reference different external data sources. Se si eseguono contemporaneamente query in diverse origini dati Hadoop, ogni origine Hadoop deve usare la stessa impostazione di configurazione del server di "connettività Hadoop".If you simultaneously run queries against different Hadoop data sources, then each Hadoop source must use the same 'hadoop connectivity' server configuration setting. Ad esempio, non è possibile eseguire contemporaneamente una query su un cluster Cloudera Hadoop e un cluster Hortonworks Hadoop poiché usano impostazioni di configurazione diverse.For example, you can't simultaneously run a query against a Cloudera Hadoop cluster and a Hortonworks Hadoop cluster since these use different configuration settings. Per le impostazioni di configurazione e le combinazioni supportate, vedere Configurazione della connettività di PolyBase.For the configuration settings and supported combinations, see PolyBase Connectivity Configuration.

Solo queste istruzioni Data Definition Language (DDL) sono consentite per le tabelle esterne:Only these Data Definition Language (DDL) statements are allowed on external tables:

  • CREATE TABLE e DROP TABLECREATE TABLE and DROP TABLE
  • CREATE STATISTICS e DROP STATISTICSCREATE STATISTICS and DROP STATISTICS
  • CREATE VIEW e DROP VIEWCREATE VIEW and DROP VIEW

Costrutti e operazioni non supportati:Constructs and operations not supported:

  • Il vincolo DEFAULT per le colonne di tabelle esterneThe DEFAULT constraint on external table columns
  • Operazioni di eliminazione, inserimento e aggiornamento di Data Manipulation Language (DML)Data Manipulation Language (DML) operations of delete, insert, and update

Limitazioni delle queryQuery limitations

PolyBase può utilizzare al massimo 33.000 file per cartella durante l'esecuzione di 32 query PolyBase simultanee.PolyBase can consume a maximum of 33k files per folder when running 32 concurrent PolyBase queries. Questo numero massimo include i file e le sottocartelle presenti in ogni cartella HDFS.This maximum number includes both files and subfolders in each HDFS folder. Se il livello di concorrenza è inferiore a 32, un utente può eseguire le query PolyBase sulle cartelle in HDFS che contengono più di 33.000 file.If the degree of concurrency is less than 32, a user can run PolyBase queries against folders in HDFS that contain more than 33k files. È consigliabile usare percorsi brevi per i file esterni e non più di 30.000 file per ogni cartella HDFS.We recommend that you keep external file paths short and use no more than 30k files per HDFS folder. Quando si fa riferimento a troppi file, potrebbe verificarsi un'eccezione di memoria insufficiente in Java Virtual Machine (JVM).When too many files are referenced, a Java Virtual Machine (JVM) out-of-memory exception might occur.

Limitazioni della larghezza della tabellaTable width limitations

PolyBase in SQL Server 2016 ha un limite di larghezza di riga di 32 KB, in base alla dimensione massima di una singola riga valida secondo la definizione della tabella.PolyBase in SQL Server 2016 has a row width limit of 32 KB based on the maximum size of a single valid row by table definition. Se la somma dello schema di colonne è maggiore di 32 KB, PolyBase non sarà in grado di eseguire query sui dati.If the sum of the column schema is greater than 32 KB, PolyBase can't query the data.

Limitazioni dei tipi di datiData type limitations

I tipi di dati seguenti non possono essere usati in tabelle esterne di PolyBase:The following data types cannot be used in PolyBase external tables:

  • geography
  • geometry
  • hierarchyid
  • image
  • text
  • nText
  • xml
  • Qualsiasi tipo definito dall'utenteAny user defined type

BloccoLocking

Blocco condiviso per l'oggetto SCHEMARESOLUTION.Shared lock on the SCHEMARESOLUTION object.

SicurezzaSecurity

I file di dati per una tabella esterna vengono archiviati in Hadoop o nell'archiviazione BLOB di Azure.The data files for an external table are stored in Hadoop or Azure blob storage. Questi file di dati vengono creati e gestiti dai processi dell'utente,These data files are created and managed by your own processes. che sarà responsabile della gestione della sicurezza dei dati esterni.It is your responsibility to manage the security of the external data.

EsempiExamples

R.A. Creare una tabella esterna con dati in formato di testo delimitatoCreate an external table with data in text-delimited format

Questo esempio illustra tutti i passaggi necessari per creare una tabella esterna i cui dati sono formattati in file di testo delimitato.This example shows all the steps required to create an external table that has data formatted in text-delimited files. Definisce un'origine dati esterna mydatasource e un formato di file esterno myfileformat.It defines an external data source mydatasource and an external file format myfileformat. A questi oggetti a livello di database viene fatto riferimento nell'istruzione CREATE EXTERNAL TABLE.These database-level objects are then referenced in the CREATE EXTERNAL TABLE statement. Per altre informazioni, vedere CREATE EXTERNAL DATA SOURCE e CREATE EXTERNAL FILE FORMAT.For more information, see CREATE EXTERNAL DATA SOURCE and CREATE EXTERNAL FILE FORMAT.

CREATE EXTERNAL DATA SOURCE mydatasource
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
)

CREATE EXTERNAL FILE FORMAT myfileformat
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (FIELD_TERMINATOR ='|')
);

CREATE EXTERNAL TABLE ClickStream (
    url varchar(50),
    event_date date,
    user_IP varchar(50)
)
WITH (
        LOCATION='/webdata/employee.tbl',
        DATA_SOURCE = mydatasource,
        FILE_FORMAT = myfileformat
    )
;

B.B. Creare una tabella esterna con dati in formato RCFILECreate an external table with data in RCFile format

Questo esempio illustra tutti i passaggi necessari per creare una tabella esterna i cui dati sono formattati come RCFILE.This example shows all the steps required to create an external table that has data formatted as RCFiles. Definisce un'origine dati esterna mydatasource_rc e un formato di file esterno myfileformat_rc.It defines an external data source mydatasource_rc and an external file format myfileformat_rc. A questi oggetti a livello di database viene fatto riferimento nell'istruzione CREATE EXTERNAL TABLE.These database-level objects are then referenced in the CREATE EXTERNAL TABLE statement. Per altre informazioni, vedere CREATE EXTERNAL DATA SOURCE e CREATE EXTERNAL FILE FORMAT.For more information, see CREATE EXTERNAL DATA SOURCE and CREATE EXTERNAL FILE FORMAT.

CREATE EXTERNAL DATA SOURCE mydatasource_rc
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
)

CREATE EXTERNAL FILE FORMAT myfileformat_rc
WITH (
    FORMAT_TYPE = RCFILE,
    SERDE_METHOD = 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
)
;

CREATE EXTERNAL TABLE ClickStream_rc (
    url varchar(50),
    event_date date,
    user_ip varchar(50)
)
WITH (
        LOCATION='/webdata/employee_rc.tbl',
        DATA_SOURCE = mydatasource_rc,
        FILE_FORMAT = myfileformat_rc
    )
;

C.C. Creare una tabella esterna con dati in formato ORCCreate an external table with data in ORC format

Questo esempio illustra tutti i passaggi necessari per creare una tabella esterna i cui dati sono formattati come file ORC.This example shows all the steps required to create an external table that has data formatted as ORC files. Definisce un'origine dati esterna mydatasource_orc e un formato di file esterno myfileformat_orc.It defines an external data source mydatasource_orc and an external file format myfileformat_orc. A questi oggetti a livello di database viene fatto riferimento nell'istruzione CREATE EXTERNAL TABLE.These database-level objects are then referenced in the CREATE EXTERNAL TABLE statement. Per altre informazioni, vedere CREATE EXTERNAL DATA SOURCE e CREATE EXTERNAL FILE FORMAT.For more information, see CREATE EXTERNAL DATA SOURCE and CREATE EXTERNAL FILE FORMAT.

CREATE EXTERNAL DATA SOURCE mydatasource_orc
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
)

CREATE EXTERNAL FILE FORMAT myfileformat_orc
WITH (
    FORMAT = ORC,
    COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
)
;

CREATE EXTERNAL TABLE ClickStream_orc (
    url varchar(50),
    event_date date,
    user_ip varchar(50)
)
WITH (
        LOCATION='/webdata/',
        DATA_SOURCE = mydatasource_orc,
        FILE_FORMAT = myfileformat_orc
    )
;

D.D. Eseguire query sui dati HadoopQuerying Hadoop data

Clickstream è una tabella esterna che si connette al file di testo delimitato employee.tbl in un cluster Hadoop.Clickstream is an external table that connects to the employee.tbl delimited text file on a Hadoop cluster. La query seguente è simile a una query eseguita su una tabella standard.The following query looks just like a query against a standard table. Tuttavia, questa query recupera i dati da Hadoop e quindi calcola i risultati.However, this query retrieves data from Hadoop and then computes the results.

SELECT TOP 10 (url) FROM ClickStream WHERE user_ip = 'xxx.xxx.xxx.xxx'
;

E.E. Unire i dati Hadoop con i dati SQLJoin Hadoop data with SQL data

Questa query è simile a un JOIN standard in due tabelle SQL.This query looks just like a standard JOIN on two SQL tables. La differenza è che PolyBase recupera i dati Clickstream da Hadoop e li aggiunge alla tabella UrlDescription.The difference is that PolyBase retrieves the Clickstream data from Hadoop and then joins it to the UrlDescription table. Una tabella è una tabella esterna e l'altra è una tabella SQL standard.One table is an external table and the other is a standard SQL table.

SELECT url.description
FROM ClickStream cs
JOIN UrlDescription url ON cs.url = url.name
WHERE cs.url = 'msdn.microsoft.com'
;

F.F. Importare dati da Hadoop in una tabella SQLImport data from Hadoop into a SQL table

In questo esempio viene creata una nuova tabella SQL ms_user che archivia in modo permanente il risultato di un join tra la tabella SQL standard user e la tabella esterna ClickStream.This example creates a new SQL table ms_user that permanently stores the result of a join between the standard SQL table user and the external table ClickStream.

SELECT DISTINCT user.FirstName, user.LastName
INTO ms_user
FROM user INNER JOIN (
    SELECT * FROM ClickStream WHERE cs.url = 'www.microsoft.com'
    ) AS ms
ON user.user_ip = ms.user_ip
;

G.G. Creare una tabella esterna per un'origine dati partizionataCreate an external table for a sharded data source

In questo esempio viene rieseguito il mapping di una DMV remota a una tabella esterna usando le clausole SCHEMA_NAME e OBJECT_NAME.This example remaps a remote DMV to an external table using the SCHEMA_NAME and OBJECT_NAME clauses.

CREATE EXTERNAL TABLE [dbo].[all_dm_exec_requests]([session_id] smallint NOT NULL,
  [request_id] int NOT NULL,
  [start_time] datetime NOT NULL,
  [status] nvarchar(30) NOT NULL,
  [command] nvarchar(32) NOT NULL,
  [sql_handle] varbinary(64),
  [statement_start_offset] int,
  [statement_end_offset] int,
  [cpu_time] int NOT NULL)
WITH
(
  DATA_SOURCE = MyExtSrc,
  SCHEMA_NAME = 'sys',
  OBJECT_NAME = 'dm_exec_requests',
  DISTRIBUTION=ROUND_ROBIN
);

H.H. Creare una tabella esterna per SQL ServerCreate an external table for SQL Server

     -- Create a Master Key
      CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'S0me!nfo';
    GO
     /*  specify credentials to external data source
     *  IDENTITY: user name for external source.
     *  SECRET: password for external source.
     */
     CREATE DATABASE SCOPED CREDENTIAL SqlServerCredentials
     WITH IDENTITY = 'username', Secret = 'password';
    GO

    /* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
    * PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
    * CREDENTIAL: the database scoped credential, created above.
    */
    CREATE EXTERNAL DATA SOURCE SQLServerInstance
    WITH (
    LOCATION = 'sqlserver://SqlServer',
    -- PUSHDOWN = ON | OFF,
      CREDENTIAL = SQLServerCredentials
    );
    GO

    CREATE SCHEMA sqlserver;
    GO

     /* LOCATION: sql server table/view in 'database_name.schema_name.object_name' format
     * DATA_SOURCE: the external data source, created above.
     */
     CREATE EXTERNAL TABLE sqlserver.customer(
     C_CUSTKEY INT NOT NULL,
     C_NAME VARCHAR(25) NOT NULL,
     C_ADDRESS VARCHAR(40) NOT NULL,
     C_NATIONKEY INT NOT NULL,
     C_PHONE CHAR(15) NOT NULL,
     C_ACCTBAL DECIMAL(15,2) NOT NULL,
     C_MKTSEGMENT CHAR(10) NOT NULL,
     C_COMMENT VARCHAR(117) NOT NULL
      )
      WITH (
      LOCATION='tpch_10.dbo.customer',
      DATA_SOURCE=SqlServerInstance
     );

I.I. Creare una tabella esterna per OracleCreate an external table for Oracle

  -- Create a Master Key
   CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
   /*
   * Specify credentials to external data source
   * IDENTITY: user name for external source.
   * SECRET: password for external source.
   */
   CREATE DATABASE SCOPED CREDENTIAL credential_name
   WITH IDENTITY = 'username', Secret = 'password';

   /*
   * LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
   * PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
   * CONNECTION_OPTIONS: Specify driver location
   * CREDENTIAL: the database scoped credential, created above.
   */
   CREATE EXTERNAL DATA SOURCE external_data_source_name
   WITH (
     LOCATION = 'oracle://<server address>[:<port>]',
     -- PUSHDOWN = ON | OFF,
     CREDENTIAL = credential_name)

   /*
   * LOCATION: Oracle table/view in '.<schema_name>.<object_name>' format
   * DATA_SOURCE: the external data source, created above.
   */
   CREATE EXTERNAL TABLE customers(
   [O_ORDERKEY] DECIMAL(38) NOT NULL,
   [O_CUSTKEY] DECIMAL(38) NOT NULL,
   [O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
   [O_TOTALPRICE] DECIMAL(15,2) NOT NULL,
   [O_ORDERDATE] DATETIME2(0) NOT NULL,
   [O_ORDERPRIORITY] CHAR(15) COLLATE Latin1_General_BIN NOT NULL,
   [O_CLERK] CHAR(15) COLLATE Latin1_General_BIN NOT NULL,
   [O_SHIPPRIORITY] DECIMAL(38) NOT NULL,
   [O_COMMENT] VARCHAR(79) COLLATE Latin1_General_BIN NOT NULL
   )
   WITH (
    LOCATION='.mySchema.customer',
    DATA_SOURCE= external_data_source_name
   );

J.J. Creare una tabella esterna per TeradataCreate an external table for Teradata

  -- Create a Master Key
   CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';

   /*
   * Specify credentials to external data source
   * IDENTITY: user name for external source.
   * SECRET: password for external source.
   */
   CREATE DATABASE SCOPED CREDENTIAL credential_name
   WITH IDENTITY = 'username', Secret = 'password';

    /* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
    * PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
    * CONNECTION_OPTIONS: Specify driver location
    * CREDENTIAL: the database scoped credential, created above.
    */
    CREATE EXTERNAL DATA SOURCE external_data_source_name
    WITH (
    LOCATION = teradata://<server address>[:<port>],
   -- PUSHDOWN = ON | OFF,
    CREDENTIAL =credential_name
    );


     /* LOCATION: Teradata table/view in '<database_name>.<object_name>' format
      * DATA_SOURCE: the external data source, created above.
      */
     CREATE EXTERNAL TABLE customer(
      L_ORDERKEY INT NOT NULL,
      L_PARTKEY INT NOT NULL,
     L_SUPPKEY INT NOT NULL,
     L_LINENUMBER INT NOT NULL,
     L_QUANTITY DECIMAL(15,2) NOT NULL,
     L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
     L_DISCOUNT DECIMAL(15,2) NOT NULL,
     L_TAX DECIMAL(15,2) NOT NULL,
     L_RETURNFLAG CHAR NOT NULL,
     L_LINESTATUS CHAR NOT NULL,
     L_SHIPDATE DATE NOT NULL,
     L_COMMITDATE DATE NOT NULL,
     L_RECEIPTDATE DATE NOT NULL,
     L_SHIPINSTRUCT CHAR(25) NOT NULL,
     L_SHIPMODE CHAR(10) NOT NULL,
     L_COMMENT VARCHAR(44) NOT NULL
     )
     WITH (
     LOCATION='customer',
     DATA_SOURCE= external_data_source_name
     );

K.K. Creare una tabella esterna per MongoDBCreate an external table for MongoDB

  -- Create a Master Key
   CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';

   /*
   * Specify credentials to external data source
   * IDENTITY: user name for external source.
   * SECRET: password for external source.
   */
   CREATE DATABASE SCOPED CREDENTIAL credential_name
   WITH IDENTITY = 'username', Secret = 'password';

     /* LOCATION: Location string should be of format '<type>://<server>[:<port>]'.
    * PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
    * CONNECTION_OPTIONS: Specify driver location
    * CREDENTIAL: the database scoped credential, created above.
    */
    CREATE EXTERNAL DATA SOURCE external_data_source_name
    WITH (
    LOCATION = mongodb://<server>[:<port>],
    -- PUSHDOWN = ON | OFF,
      CREDENTIAL = credential_name
    );

     /* LOCATION: MongoDB table/view in '<database_name>.<schema_name>.<object_name>' format
     * DATA_SOURCE: the external data source, created above.
     */
     CREATE EXTERNAL TABLE customers(
     [O_ORDERKEY] DECIMAL(38) NOT NULL,
     [O_CUSTKEY] DECIMAL(38) NOT NULL,
     [O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
     [O_TOTALPRICE] DECIMAL(15,2) NOT NULL,
     [O_ORDERDATE] DATETIME2(0) NOT NULL,
     [O_COMMENT] VARCHAR(79) COLLATE Latin1_General_BIN NOT NULL
     )
     WITH (
     LOCATION='customer',
     DATA_SOURCE= external_data_source_name
     );

Vedere ancheSee Also

* Database SQL *  * SQL Database *  

 

Panoramica: database SQL di AzureOverview: Azure SQL Database

Nel database SQL di Azure crea una tabella esterna per query elastiche (in anteprima).In Azure SQL Database, creates an external table for elastic queries (in preview).

Vedere anche CREATE EXTERNAL DATA SOURCE.See also CREATE EXTERNAL DATA SOURCE.

SintassiSyntax

-- Create a table for use with elastic query  
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ ,...n ] )  
    WITH ( <sharded_external_table_options> )  
[;]  

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

<sharded_external_table_options> ::=  
        DATA_SOURCE = external_data_source_name,
        SCHEMA_NAME = N'nonescaped_schema_name',  
        OBJECT_NAME = N'nonescaped_object_name',  
        [DISTRIBUTION  = SHARDED(sharding_column_name) | REPLICATED | ROUND_ROBIN]]  
    )  
[;]  

ArgomentiArguments

{ database_name.schema_name.table_name | schema_name.table_name | table_name } è il nome della tabella da creare, composto da una, due o tre parti.{ database_name.schema_name.table_name | schema_name.table_name | table_name } The one to three-part name of the table to create. Per una tabella esterna, solo i metadati della tabella vengono archiviati in SQL insieme alle statistiche di base relative al file o alla cartella a cui viene fatto riferimento nel database SQL di Azure.For an external table, SQL stores only the table metadata along with basic statistics about the file or folder that is referenced in Azure SQL Database. I dati effettivi non vengono spostati o archiviati nel database SQL di Azure.No actual data is moved or stored in Azure SQL Database.

Importante

Per ottenere prestazioni ottimali, se il driver dell'origine dati esterna supporta un nome in tre parti, è consigliabile specificare il nome in tre parti.For best performance, if the external data source driver supports a three-part name, it is strongly recommended to provide the three-part name.

<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supporta la possibilità di configurare il nome di colonna, il tipo di dati, il supporto dei valori Null e le regole di confronto.<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supports the ability to configure column name, data type, nullability and collation. Non è possibile usare DEFAULT CONSTRAINT nelle tabelle esterne.You can't use the DEFAULT CONSTRAINT on external tables.

Nota

Text, nText e XML non sono tipi di dati supportati per le colonne nelle tabelle esterne per il database SQL di Azure.Text, nText and XML are not supported data types for columns in external tables for Azure SQL Database.

Le definizioni di colonna, inclusi i tipi di dati e il numero di colonne, devono corrispondere ai dati nei file esterni.The column definitions, including the data types and number of columns, must match the data in the external files. In caso di mancata corrispondenza, le righe di file verranno rifiutate quando si eseguono query sui dati effettivi.If there's a mismatch, the file rows will be rejected when querying the actual data.

Opzioni per la tabella esterna partizionataSharded external table options

Specifica l'origine dati esterna (un'origine dati non SQL Server) e un metodo di distribuzione per la query elastica.Specifies the external data source (a non-SQL Server data source) and a distribution method for the Elastic query.

DATA_SOURCE La clausola DATA_SOURCE definisce l'origine dati esterna (una mappa partizioni) usata per la tabella esterna.DATA_SOURCE The DATA_SOURCE clause defines the external data source (a shard map) that is used for the external table. Per un esempio, vedere Creare tabelle esterne.For an example, see Create external tables.

SCHEMA_NAME e OBJECT_NAME Le clausole SCHEMA_NAME e OBJECT_NAME eseguono il mapping della definizione della tabella esterna a una tabella in uno schema diverso.SCHEMA_NAME and OBJECT_NAME The SCHEMA_NAME and OBJECT_NAME clauses map the external table definition to a table in a different schema. Se queste clausole vengono omesse, si presuppone che lo schema dell'oggetto remoto sia "dbo" e che il relativo nome sia identico al nome della tabella esterna in fase di definizione.If omitted, the schema of the remote object is assumed to be "dbo" and its name is assumed to be identical to the external table name being defined. Questo è utile se il nome della tabella remota è già in uso nel database in cui si vuole creare la tabella esterna.This is useful if the name of your remote table is already taken in the database where you want to create the external table. Ad esempio, si vuole definire una tabella esterna per ottenere una visualizzazione aggregata delle viste del catalogo o delle viste a gestione dinamica (DMV) nel livello dati con scalabilità orizzontale.For example, you want to define an external table to get an aggregate view of catalog views or DMVs on your scaled out data tier. Poiché le viste del catalogo e le DMV esistono già localmente, non sarà possibile usare i rispettivi nomi per la definizione della tabella esterna.Since catalog views and DMVs already exist locally, you cannot use their names for the external table definition. Usare invece un nome diverso e usare il nome della vista del catalogo o della vista DMV nelle clausole SCHEMA_NAME e/o OBJECT_NAME.Instead, use a different name and use the catalog view's or the DMV's name in the SCHEMA_NAME and/or OBJECT_NAME clauses. Per un esempio, vedere Creare tabelle esterne.For an example, see Create external tables.

DISTRIBUTION La clausola DISTRIBUTION specifica la distribuzione dei dati usata per questa tabella.DISTRIBUTION The DISTRIBUTION clause specifies the data distribution used for this table. Query Processor utilizza le informazioni fornite nella clausola DISTRIBUTION per generare i piani di query più efficienti.The query processor utilizes the information provided in the DISTRIBUTION clause to build the most efficient query plans.

  • SHARDED indica che i dati sono partizionati orizzontalmente tra i database.SHARDED means data is horizontally partitioned across the databases. La chiave di partizionamento per la distribuzione dei dati è il parametro <sharding_column_name>.The partitioning key for the data distribution is the <sharding_column_name> parameter.
  • REPLICATED indica che in ogni database sono presenti copie identiche della tabella.REPLICATED means that identical copies of the table are present on each database. Sarà quindi necessario assicurarsi che le repliche siano identiche in tutti i database.It is your responsibility to ensure that the replicas are identical across the databases.
  • ROUND_ROBIN indica che la tabella è partizionata orizzontalmente con un metodo di distribuzione dipendente dall'applicazione.ROUND_ROBIN means that the table is horizontally partitioned using an application-dependent distribution method.

AutorizzazioniPermissions

Gli utenti con accesso alla tabella esterna ottengono automaticamente l'accesso alle tabelle remote sottostanti con le credenziali specificate nella definizione dell'origine dati esterna.Users with access to the external table automatically gain access to the underlying remote tables under the credential given in the external data source definition. Evitare l'elevazione dei privilegi indesiderata mediante le credenziali dell'origine dati esterna.Avoid undesired elevation of privileges through the credential of the external data source. Usare GRANT o REVOKE per la tabella esterna, come se fosse una tabella comune.Use GRANT or REVOKE for an external table just as though it were a regular table. Dopo aver definito l'origine dati esterna e le tabelle esterne, è ora possibile usare la sintassi T-SQL completa sulle tabelle esterne.Once you have defined your external data source and your external tables, you can now use full T-SQL over your external tables.

Gestione degli erroriError Handling

Durante l'esecuzione dell'istruzione CREATE EXTERNAL TABLE, se il tentativo di connessione non riesce, l'istruzione ha esito negativo e la tabella esterna non viene creata.While executing the CREATE EXTERNAL TABLE statement, if the attempt to connect fails, the statement will fail and the external table won't be created. La conferma dell'esito negativo del comando può richiedere almeno un minuto perché il database SQL ritenta la connessione prima di determinare l'esito negativo della query.It can take a minute or more for the command to fail since SQL Database retries the connection before eventually failing the query.

Osservazioni generaliGeneral Remarks

Negli scenari di query ad hoc, ad esempio SELECT FROM EXTERNAL TABLE, il database SQL archivia le righe recuperate dall'origine dati esterna in una tabella temporanea.In ad-hoc query scenarios, such as SELECT FROM EXTERNAL TABLE, SQL Database stores the rows that are retrieved from the external data source in a temporary table. Dopo il completamento della query, il database SQL rimuove ed elimina la tabella temporanea.After the query completes, SQL Database removes and deletes the temporary table. Nessun dato permanente viene archiviato nelle tabelle SQL.No permanent data is stored in SQL tables.

Al contrario, nello scenario di importazione, ad esempio SELECT INTO FROM EXTERNAL TABLE, il database SQL archivia le righe recuperate dall'origine dati esterna come dati permanenti nella tabella SQL.In contrast, in the import scenario, such as SELECT INTO FROM EXTERNAL TABLE, SQL Database stores the rows that are retrieved from the external data source as permanent data in the SQL table. La nuova tabella viene creata durante l'esecuzione della query quando il database SQL recupera i dati esterni.The new table is created during query execution when SQL Database retrieves the external data.

È possibile creare numerose tabelle esterne che fanno riferimento alle stesse o ad altre origini dati esterne.You can create many external tables that reference the same or different external data sources.

Limitazioni e restrizioniLimitations and Restrictions

L'accesso ai dati tramite una tabella esterna non rispetta la semantica di isolamento all'interno di SQL Server.Access to data via an external table doesn't adhere to the isolation semantics within SQL Server. Ciò significa che l'esecuzione di query su una tabella esterna non impone alcun blocco o isolamento dello snapshot. I dati restituiti possono quindi cambiare se i dati nell'origine dati esterna cambiano.This means that querying an external doesn't impose any locking or snapshot isolation and thus data return can change if the data in the external data source is changing. La stessa query può restituire risultati diversi ogni volta che viene eseguita su una tabella esterna.The same query can return different results each time it runs against an external table. Analogamente, una query può non riuscire se i dati esterni vengono spostati o rimossi.Similarly, a query might fail if the external data is moved or removed.

È possibile creare più tabelle esterne che fanno tutte riferimento a origini dati esterne differenti.You can create multiple external tables that each reference different external data sources.

Solo queste istruzioni Data Definition Language (DDL) sono consentite per le tabelle esterne:Only these Data Definition Language (DDL) statements are allowed on external tables:

  • CREATE TABLE e DROP TABLECREATE TABLE and DROP TABLE
  • CREATE VIEW e DROP VIEWCREATE VIEW and DROP VIEW

Costrutti e operazioni non supportati:Constructs and operations not supported:

  • Il vincolo DEFAULT per le colonne di tabelle esterneThe DEFAULT constraint on external table columns
  • Operazioni di eliminazione, inserimento e aggiornamento di Data Manipulation Language (DML)Data Manipulation Language (DML) operations of delete, insert, and update

Solo i predicati letterali definiti in una query possono essere propagati nell'origine dati esterna.Only literal predicates defined in a query can be pushed down to the external data source. Questo rappresenta una differenza rispetto ai server collegati e all'accesso a posizioni in cui è possibile usare predicati determinati durante l'esecuzione di query, ad esempio in combinazione con un ciclo annidato in un piano di query.This is unlike linked servers and accessing where predicates determined during query execution can be used, i.e. when used in conjunction with a nested loop in a query plan. Ciò porta spesso alla copia in locale dell'intera tabella esterna e quindi al join della tabella stessa.This will often lead to the whole external table being copied locally and then joined to.

  \\ Assuming External.Orders is an external table and Customer is a local table.
  \\ This query  will copy the whole of the external locally as the predicate needed
  \\ to filter isn't known at compile time. Its only known during execution of the query

  SELECT Orders.OrderId, Orders.OrderTotal
    FROM External.Orders
   WHERE CustomerId in (SELECT TOP 1 CustomerId
                          FROM Customer
                          WHERE CustomerName = 'MyCompany')

L'uso di tabelle esterne impedisce l'uso del parallelismo nel piano di query.Use of External Tables prevents use of parallelism in the query plan.

Le tabelle esterne vengono implementate come query remote e, di conseguenza, il numero stimato di righe restituite è in genere pari a 1000. Esistono altre regole basate sul tipo di predicato usato per filtrare la tabella esterna.External tables are implemented as Remote Query and as such the estimated number of rows returned is generally 1000, there are other rules based on the type of predicate used to filter the external table. Si tratta di stime basate su regole anziché di stime basate sui dati effettivi della tabella esterna.They are rules-based estimates rather than estimates based on the actual data in the external table. Lo strumento di ottimizzazione non accede all'origine dati remota per ottenere una stima più accurata.The optimizer doesn't access the remote data source to obtain a more accurate estimate.

Limitazioni dei tipi di datiData type limitations

I tipi di dati seguenti non possono essere usati in tabelle esterne di PolyBase:The following data types cannot be used in PolyBase external tables:

  • geography
  • geometry
  • hierarchyid
  • image
  • text
  • nText
  • xml
  • Qualsiasi tipo definito dall'utenteAny user defined type

BloccoLocking

Blocco condiviso per l'oggetto SCHEMARESOLUTION.Shared lock on the SCHEMARESOLUTION object.

EsempiExamples

R.A. Creare una tabella esterna per il database SQL di AzureCreate external table for Azure SQL Database

CREATE EXTERNAL TABLE [dbo].[CustomerInformation]
( [CustomerID] [int] NOT NULL,
  [CustomerName] [varchar](50) NOT NULL,
  [Company] [varchar](50) NOT NULL)
WITH
( DATA_SOURCE = MyElasticDBQueryDataSrc)

Vedere ancheSee Also

* Azure Synapse
Analytics *
 
* Azure Synapse
Analytics *
 

 

Panoramica: Azure Synapse AnalyticsOverview: Azure Synapse Analytics

Usare una tabella esterna per:Use an external table to:

  • Eseguire query sui dati di Hadoop o dell'archiviazione BLOB di Azure con istruzioni Transact-SQLTransact-SQL.Query Hadoop or Azure blob storage data with Transact-SQLTransact-SQL statements.
  • Importare e archiviare i dati da Hadoop o dall'archiviazione BLOB di Azure.Import and store data from Hadoop or Azure blob storage.
  • Importare e archiviare dati da Azure Data Lake Store.Import and store data from Azure Data Lake Store.

Vedere anche CREATE EXTERNAL DATA SOURCE e DROP EXTERNAL TABLE.See also CREATE EXTERNAL DATA SOURCE and DROP EXTERNAL TABLE.

SintassiSyntax

CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ ,...n ] )  
    WITH (
        LOCATION = 'hdfs_folder_or_filepath',  
        DATA_SOURCE = external_data_source_name,  
        FILE_FORMAT = external_file_format_name  
        [ , <reject_options> [ ,...n ] ]  
    )  
[;]  

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

<reject_options> ::=  
{  
    | REJECT_TYPE = value | percentage,  
    | REJECT_VALUE = reject_value,  
    | REJECT_SAMPLE_VALUE = reject_sample_value,
    | REJECTED_ROW_LOCATION = '/REJECT_Directory'
}  

ArgomentiArguments

{ database_name.schema_name.table_name | schema_name.table_name | table_name } è il nome della tabella da creare, composto da una, due o tre parti.{ database_name.schema_name.table_name | schema_name.table_name | table_name } The one to three-part name of the table to create. Per una tabella esterna, solo i metadati della tabella, insieme alle statistiche di base relative al file o alla cartella a cui viene fatto riferimento in Azure Data Lake, in Hadoop o nell'archiviazione BLOB di Azure.For an external table, only the table metadata along with basic statistics about the file or folder that is referenced in Azure Data Lake, Hadoop, or Azure blob storage. Quando vengono create tabelle esterne, i dati effettivi non vengono spostati né archiviati.No actual data is moved or stored when external tables are created.

Importante

Per ottenere prestazioni ottimali, se il driver dell'origine dati esterna supporta un nome in tre parti, è consigliabile specificare il nome in tre parti.For best performance, if the external data source driver supports a three-part name, it is strongly recommended to provide the three-part name.

<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supporta la possibilità di configurare il nome di colonna, il tipo di dati, il supporto dei valori Null e le regole di confronto.<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supports the ability to configure column name, data type, nullability and collation. Non è possibile usare DEFAULT CONSTRAINT nelle tabelle esterne.You can't use the DEFAULT CONSTRAINT on external tables.

Nota

Text, nText e XML non sono tipi di dati supportati per le colonne nelle tabelle esterne per Azure SQL Data Warehouse.Text, nText and XML are not supported data types for columns in external tables for Azure SQL Warehouse.

Le definizioni di colonna, inclusi i tipi di dati e il numero di colonne, devono corrispondere ai dati nei file esterni.The column definitions, including the data types and number of columns, must match the data in the external files. In caso di mancata corrispondenza, le righe di file verranno rifiutate quando si eseguono query sui dati effettivi.If there's a mismatch, the file rows will be rejected when querying the actual data.

LOCATION = 'folder_or_filepath' specifica la cartella o il percorso e il nome file per i dati effettivi in Azure Data Lake, Hadoop o Archiviazione BLOB di Azure.LOCATION = 'folder_or_filepath' Specifies the folder or the file path and file name for the actual data in Azure Data Lake, Hadoop, or Azure blob storage. Il percorso inizia dalla cartella radice.The location starts from the root folder. La cartella radice è il percorso dei dati specificato nell'origine dati esterna.The root folder is the data location specified in the external data source. L'istruzione CREATE EXTERNAL TABLE AS SELECT crea il percorso e la cartella, se non esistono.The CREATE EXTERNAL TABLE AS SELECT statement creates the path and folder if it doesn't exist. CREATE EXTERNAL TABLE non crea il percorso e la cartella.CREATE EXTERNAL TABLE doesn't create the path and folder.

Se si specifica che LOCATION deve essere una cartella, una query PolyBase che effettua selezioni dalla tabella esterna recupererà i file dalla cartella e da tutte le relative sottocartelle.If you specify LOCATION to be a folder, a PolyBase query that selects from the external table will retrieve files from the folder and all of its subfolders. Proprio come Hadoop, PolyBase non restituisce le cartelle nascoste.Just like Hadoop, PolyBase doesn't return hidden folders. Inoltre, non restituisce i file il cui nome file inizia con un carattere di sottolineatura () o un punto (.).It also doesn't return files for which the file name begins with an underline () or a period (.).

In questo esempio, se LOCATION='/webdata/', una query PolyBase restituisce le righe da mydata.txt e mydata2.txt.In this example, if LOCATION='/webdata/', a PolyBase query will return rows from mydata.txt and mydata2.txt. Non restituirà mydata3.txt perché è una sottocartella di una cartella nascosta.It won't return mydata3.txt because it's a subfolder of a hidden folder. Non restituirà _hidden.txt perché è un file nascosto.And it won't return _hidden.txt because it's a hidden file.

Dati ricorsivi per tabelle esterneRecursive data for external tables

Per modificare l'impostazione predefinita e leggere solo dalla directory radice, impostare l'attributo <polybase.recursive.traversal> su 'false' nel file di configurazione core-site.xml.To change the default and only read from the root folder, set the attribute <polybase.recursive.traversal> to 'false' in the core-site.xml configuration file. Questo file si trova in <SqlBinRoot>\PolyBase\Hadoop\Conf with SqlBinRoot the bin root of SQl Server.This file is located under <SqlBinRoot>\PolyBase\Hadoop\Conf with SqlBinRoot the bin root of SQl Server. Ad esempio: C:\\Program Files\\Microsoft SQL Server\\MSSQL13.XD14\\MSSQL\\Binn.For example, C:\\Program Files\\Microsoft SQL Server\\MSSQL13.XD14\\MSSQL\\Binn.

DATA_SOURCE = external_data_source_name specifica il nome dell'origine dati esterna che contiene il percorso dei dati esterni.DATA_SOURCE = external_data_source_name Specifies the name of the external data source that contains the location of the external data. Questo percorso è in Azure Data Lake.This location is in Azure Data Lake. Per creare un'origine dati esterna, usare CREATE EXTERNAL DATA SOURCE.To create an external data source, use CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name specifica il nome dell'oggetto formato di file esterno che contiene il tipo di file e il metodo di compressione per i dati esterni.FILE_FORMAT = external_file_format_name Specifies the name of the external file format object that stores the file type and compression method for the external data. Per creare un formato di file esterno, usare CREATE EXTERNAL FILE FORMAT.To create an external file format, use CREATE EXTERNAL FILE FORMAT.

Le opzioni REJECT consentono di specificare i parametri di rifiuto che determinano il modo in cui PolyBase gestirà i record dirty recuperati dall'origine dati esterna.Reject Options You can specify reject parameters that determine how PolyBase will handle dirty records it retrieves from the external data source. Un record di dati è considerato "dirty" se i tipi di dati effettivi o il numero di colonne non corrispondono alle definizioni di colonna della tabella esterna.A data record is considered 'dirty' if it actual data types or the number of columns don't match the column definitions of the external table.

Se non si specificano o si modificano i valori di rifiuto, PolyBase usa i valori predefiniti.When you don't specify or change reject values, PolyBase uses default values. Queste informazioni sui parametri di rifiuto vengono archiviate come metadati aggiuntivi quando si crea una tabella esterna con l'istruzione CREATE EXTERNAL TABLE.This information about the reject parameters is stored as additional metadata when you create an external table with CREATE EXTERNAL TABLE statement. Quando un'istruzione SELECT o SELECT INTO SELECT futura seleziona i dati dalla tabella esterna, PolyBase usa le opzioni di rifiuto per determinare il numero o la percentuale di righe che possono essere rifiutate prima che la query effettiva abbia esito negativo.When a future SELECT statement or SELECT INTO SELECT statement selects data from the external table, PolyBase will use the reject options to determine the number or percentage of rows that can be rejected before the actual query fails. La query restituirà risultati (parziali) finché non viene superata la soglia di rifiuto,The query will return (partial) results until the reject threshold is exceeded. quindi ha esito negativo con il messaggio di errore appropriato.It then fails with the appropriate error message.

REJECT_TYPE = value | percentage indica se l'opzione REJECT_VALUE è specificata come valore letterale o percentuale.REJECT_TYPE = value | percentage Clarifies whether the REJECT_VALUE option is specified as a literal value or a percentage.

L'opzione REJECT_VALUE di tipo value indica un valore letterale, non una percentuale.value REJECT_VALUE is a literal value, not a percentage. La query PolyBase avrà esito negativo se il numero di righe rifiutate supera reject_value.The PolyBase query will fail when the number of rejected rows exceeds reject_value.

Ad esempio, se REJECT_VALUE = 5 e REJECT_TYPE = value, la query SELECT di PolyBase avrà esito negativo dopo che sono state rifiutate cinque righe.For example, if REJECT_VALUE = 5 and REJECT_TYPE = value, the PolyBase SELECT query will fail after five rows have been rejected.

L'opzione REJECT_VALUE di tipo percentage indica una percentuale, non un valore letterale.percentage REJECT_VALUE is a percentage, not a literal value. La query PolyBase avrà esito negativo se la percentuale di righe non eseguite supera il valore reject_value.A PolyBase query will fail when the percentage of failed rows exceeds reject_value. La percentuale di righe con esito negativo viene calcolata a intervalli.The percentage of failed rows is calculated at intervals.

REJECT_VALUE = reject_value specifica il valore o la percentuale di righe che possono essere rifiutate prima che la query abbia esito negativo.REJECT_VALUE = reject_value Specifies the value or the percentage of rows that can be rejected before the query fails.

Per REJECT_TYPE = value, reject_value deve essere un numero intero compreso tra 0 e 2.147.483.647.For REJECT_TYPE = value, reject_value must be an integer between 0 and 2,147,483,647.

Per REJECT_TYPE = percentage, reject_value deve essere un valore float compreso tra 0 e 100.For REJECT_TYPE = percentage, reject_value must be a float between 0 and 100.

REJECT_SAMPLE_VALUE = reject_sample_value è un attributo obbligatorio quando si specifica REJECT_TYPE = percentage.REJECT_SAMPLE_VALUE = reject_sample_value This attribute is required when you specify REJECT_TYPE = percentage. Determina il numero di righe che si deve tentare di recuperare prima che PolyBase ricalcoli la percentuale di righe rifiutate.It determines the number of rows to attempt to retrieve before the PolyBase recalculates the percentage of rejected rows.

Il parametro reject_sample_value deve essere un numero intero compreso tra 0 e 2.147.483.647.The reject_sample_value parameter must be an integer between 0 and 2,147,483,647.

Ad esempio, se REJECT_SAMPLE_VALUE = 1000, PolyBase calcola la percentuale di righe con esito negativo dopo che ha tentato di importare 1000 righe dal file di dati esterno.For example, if REJECT_SAMPLE_VALUE = 1000, PolyBase will calculate the percentage of failed rows after it has attempted to import 1000 rows from the external data file. Se la percentuale di righe con esito negativo è inferiore al valore reject_value, PolyBase tenterà di recuperare altre 1000 righe.If the percentage of failed rows is less than reject_value, PolyBase will attempt to retrieve another 1000 rows. Continua a ricalcolare la percentuale di righe con esito negativo dopo aver tentato di importare ognuna delle 1000 righe aggiuntive.It continues to recalculate the percentage of failed rows after it attempts to import each additional 1000 rows.

Nota

Poiché PolyBase calcola la percentuale di righe con esito negativo a intervalli, la percentuale effettiva di tali righe può superare reject_value.Since PolyBase computes the percentage of failed rows at intervals, the actual percentage of failed rows can exceed reject_value.

Esempio:Example:

Questo esempio illustra come le tre opzioni REJECT interagiscono tra loro.This example shows how the three REJECT options interact with each other. Ad esempio, se REJECT_TYPE = percentage, REJECT_VALUE = 30 e REJECT_SAMPLE_VALUE = 100, potrebbe verificarsi il seguente scenario:For example, if REJECT_TYPE = percentage, REJECT_VALUE = 30, and REJECT_SAMPLE_VALUE = 100, the following scenario could occur:

  • PolyBase tenta di recuperare le prime 100 righe di cui 25 avranno esito negativo e 75 esito positivo.PolyBase attempts to retrieve the first 100 rows; 25 fail and 75 succeed.
  • La percentuale di righe con esito negativo viene calcolata come 25%, che è minore del valore di rifiuto pari al 30%.Percent of failed rows is calculated as 25%, which is less than the reject value of 30%. Di conseguenza, PolyBase continuerà a recuperare i dati dall'origine dati esterna.As a result, PolyBase will continue retrieving data from the external data source.
  • PolyBase tenta di caricare le 100 righe successive: questa volta 25 righe hanno esito positivo e 75 righe hanno esito negativo.PolyBase attempts to load the next 100 rows; this time 25 rows succeed and 75 rows fail.
  • Percentuale di righe con esito negativo viene ricalcolata come 50%.Percent of failed rows is recalculated as 50%. La percentuale di righe con esito negativo ha superato il valore di rifiuto del 30%.The percentage of failed rows has exceeded the 30% reject value.
  • La query PolyBase ha esito negativo con il 50% di righe rifiutate dopo aver tentato di restituire le prime 200 righe.The PolyBase query fails with 50% rejected rows after attempting to return the first 200 rows. Si noti che le righe corrispondenti vengono restituite prima che la query PolyBase rilevi che è stata superata la soglia di rifiuto.Notice that matching rows have been returned before the PolyBase query detects the reject threshold has been exceeded.

REJECTED_ROW_LOCATION = posizione della directoryREJECTED_ROW_LOCATION = Directory Location

Specifica la directory all'interno dell'origine dati esterna in cui vengono scritte le righe rifiutate e il file di errori corrispondente.Specifies the directory within the External Data Source that the rejected rows and the corresponding error file should be written. Se il percorso specificato non esiste, PolyBase ne crea uno automaticamente.If the specified path doesn't exist, PolyBase will create one on your behalf. Viene creata una directory figlio con nome "_rejectedrows".A child directory is created with the name "_rejectedrows". Il carattere "_" assicura che la directory venga ignorata da altre attività di elaborazione dati, salvo se indicata in modo esplicito nel parametro del percorso.The "_" character ensures that the directory is escaped for other data processing unless explicitly named in the location parameter. Questa directory include una cartella creata in base all'ora di inoltro del carico, con il formato AnnoMeseGiorno - OraMinutoSecondo (ad esempioWithin this directory, there's a folder created based on the time of load submission in the format YearMonthDay -HourMinuteSecond (Ex. 20180330-173205).20180330-173205). In questa cartella vengono scritte due tipi di file, i file _reason (file del motivo) e i file di dati.In this folder, two types of files are written, the _reason file and the data file.

Sia i file del motivo che i file di dati hanno il queryID associato all'istruzione CTAS.The reason files and the data files both have the queryID associated with the CTAS statement. Poiché i dati e il motivo si trovano in file distinti, i file corrispondenti hanno un suffisso corrispondente.Because the data and the reason are in separate files, corresponding files have a matching suffix.

AutorizzazioniPermissions

Richiede queste autorizzazioni utente:Requires these user permissions:

  • CREATE TABLECREATE TABLE
  • ALTER ANY SCHEMAALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMATALTER ANY EXTERNAL FILE FORMAT

Nota

Le autorizzazioni CONTROL DATABASE sono necessarie per creare solo MASTER KEY, DATABASE SCOPED CREDENTIAL ed EXTERNAL DATA SOURCECONTROL DATABASE permissions are required to create only the MASTER KEY, DATABASE SCOPED CREDENTIAL, and EXTERNAL DATA SOURCE

Si noti che l'account di accesso che crea l'origine dati esterna deve avere le autorizzazioni necessarie per leggere e scrivere nell'origine dati esterna, che si trova in Hadoop o nell'archiviazione BLOB di Azure.Note, the login that creates the external data source must have permission to read and write to the external data source, located in Hadoop or Azure blob storage.

Importante

L'autorizzazione ALTER ANY EXTERNAL DATA SOURCE concede a qualsiasi entità di sicurezza la possibilità di creare e modificare qualsiasi oggetto origine dati esterna e, di conseguenza, la possibilità di accedere a tutte le credenziali con ambito database nel database.The ALTER ANY EXTERNAL DATA SOURCE permission grants any principal the ability to create and modify any external data source object, and therefore, it also grants the ability to access all database scoped credentials on the database. Questa autorizzazione deve essere considerata con privilegi elevati e quindi essere concessa solo a entità attendibili nel sistema.This permission must be considered as highly privileged, and therefore must be granted only to trusted principals in the system.

Gestione degli erroriError Handling

Durante l'esecuzione dell'istruzione CREATE EXTERNAL TABLE, PolyBase tenta di connettersi all'origine dati esterna.While executing the CREATE EXTERNAL TABLE statement, PolyBase attempts to connect to the external data source. Se il tentativo di connessione non riesce, l'istruzione ha esito negativo e la tabella esterna non viene creata.If the attempt to connect fails, the statement will fail and the external table won't be created. La conferma dell'esito negativo del comando può richiedere almeno un minuto perché PolyBase ritenta la connessione prima di stabilire che la query non riesce.It can take a minute or more for the command to fail since PolyBase retries the connection before eventually failing the query.

Osservazioni generaliGeneral Remarks

Negli scenari di query ad hoc, ad esempio SELECT FROM EXTERNAL TABLE, PolyBase archivia le righe recuperate dall'origine dati esterna in una tabella temporanea.In ad-hoc query scenarios, such as SELECT FROM EXTERNAL TABLE, PolyBase stores the rows that are retrieved from the external data source in a temporary table. Dopo il completamento della query, PolyBase rimuove ed elimina la tabella temporanea.After the query completes, PolyBase removes and deletes the temporary table. Nessun dato permanente viene archiviato nelle tabelle SQL.No permanent data is stored in SQL tables.

Al contrario, nello scenario di importazione, ad esempio SELECT INTO FROM EXTERNAL TABLE, PolyBase archivia le righe recuperate dall'origine dati esterna come dati permanenti nella tabella SQL.In contrast, in the import scenario, such as SELECT INTO FROM EXTERNAL TABLE, PolyBase stores the rows that are retrieved from the external data source as permanent data in the SQL table. La nuova tabella viene creata durante l'esecuzione della query quando PolyBase recupera i dati esterni.The new table is created during query execution when PolyBase retrieves the external data.

PolyBase può eseguire il push di parte del calcolo della query in Hadoop per migliorare le prestazioni della query.PolyBase can push some of the query computation to Hadoop to improve query performance. Questa operazione è chiamata distribuzione del predicato.This action is called predicate pushdown. Per abilitarla, specificare l'opzione del percorso della gestione risorse di Hadoop in CREATE EXTERNAL DATA SOURCE.To enable it, specify the Hadoop resource manager location option in CREATE EXTERNAL DATA SOURCE.

È possibile creare numerose tabelle esterne che fanno riferimento alle stesse o ad altre origini dati esterne.You can create many external tables that reference the same or different external data sources.

Limitazioni e restrizioniLimitations and Restrictions

Poiché non si trovano sotto il controllo di gestione diretto di Azure Synapse, i dati per una tabella possono essere modificati o rimossi in qualsiasi momento da un processo esterno.Since the data for an external table is not under the direct management control of Azure Synapse, it can be changed or removed at any time by an external process. Per questo motivo, non si garantisce che i risultati delle query in una tabella esterna siano deterministici.As a result, query results against an external table aren't guaranteed to be deterministic. La stessa query può restituire risultati diversi ogni volta che viene eseguita su una tabella esterna.The same query can return different results each time it runs against an external table. Analogamente, una query può non riuscire se i dati esterni vengono spostati o rimossi.Similarly, a query might fail if the external data is moved or removed.

È possibile creare più tabelle esterne che fanno tutte riferimento a origini dati esterne differenti.You can create multiple external tables that each reference different external data sources.

Solo queste istruzioni Data Definition Language (DDL) sono consentite per le tabelle esterne:Only these Data Definition Language (DDL) statements are allowed on external tables:

  • CREATE TABLE e DROP TABLECREATE TABLE and DROP TABLE
  • CREATE STATISTICS e DROP STATISTICSCREATE STATISTICS and DROP STATISTICS
  • CREATE VIEW e DROP VIEWCREATE VIEW and DROP VIEW

Costrutti e operazioni non supportati:Constructs and operations not supported:

  • Il vincolo DEFAULT per le colonne di tabelle esterneThe DEFAULT constraint on external table columns
  • Operazioni di eliminazione, inserimento e aggiornamento di Data Manipulation Language (DML)Data Manipulation Language (DML) operations of delete, insert, and update

Limitazioni delle queryQuery limitations

Si consiglia di non fare riferimento a più di 30.000 file per cartella.It is recommended to not exceed no more than 30k files per folder. Quando si fa riferimento a troppi file, potrebbe verificarsi un'eccezione di memoria insufficiente in Java Virtual Machine (JVM) o un peggioramento delle prestazioni.When too many files are referenced, a Java Virtual Machine (JVM) out-of-memory exception might occur or performance may degrade.

Limitazioni della larghezza della tabellaTable width limitations

PolyBase in Azure Data Warehouse ha un limite di larghezza di riga di 1 MB, in base alla dimensione massima di una singola riga valida secondo la definizione della tabella.PolyBase in Azure Data Warehouse has a row width limit of 1 MB based on the maximum size of a single valid row by table definition. Se la somma dello schema di colonne è maggiore di 1 MB, PolyBase non sarà in grado di eseguire query sui dati.If the sum of the column schema is greater than 1 MB, PolyBase can't query the data.

Limitazioni dei tipi di datiData type limitations

I tipi di dati seguenti non possono essere usati in tabelle esterne di PolyBase:The following data types cannot be used in PolyBase external tables:

  • geography
  • geometry
  • hierarchyid
  • image
  • text
  • nText
  • xml
  • Qualsiasi tipo definito dall'utenteAny user defined type

BloccoLocking

Blocco condiviso per l'oggetto SCHEMARESOLUTION.Shared lock on the SCHEMARESOLUTION object.

EsempiExamples

R.A. Importazione di dati da Azure Data Lake Storage Gen 2 in Azure Microsoft Azure Synapse AnalyticsMicrosoft Azure Synapse Analytics.Importing Data from ADLS Gen 2 into Azure Microsoft Azure Synapse AnalyticsMicrosoft Azure Synapse Analytics.

Per esempi per Azure Data Lake Storage Gen 1, vedere Creare un'origine dati esterna.For examples for Gen ADLS Gen 1, see Create external data source.


-- These values come from your Azure Active Directory Application used to authenticate to ADLS Gen 2. 
CREATE DATABASE SCOPED CREDENTIAL ADLUser
WITH IDENTITY = '<clientID>@\<OAuth2.0TokenEndPoint>',
SECRET = '<KEY>' ;

CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (TYPE = HADOOP,
      LOCATION = 'abfss://data@pbasetr.azuredatalakestore.net'
)

CREATE EXTERNAL FILE FORMAT TextFileFormat
WITH
(
    FORMAT_TYPE = DELIMITEDTEXT
    , FORMAT_OPTIONS ( FIELD_TERMINATOR = '|'
       , STRING_DELIMITER = ''
      , DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss.fff'
      , USE_TYPE_DEFAULT = FALSE
      )
)

CREATE EXTERNAL TABLE [dbo].[DimProductexternal]
( [ProductKey] [int] NOT NULL,
  [ProductLabel] nvarchar NULL,
  [ProductName] nvarchar NULL )
WITH
(
    LOCATION='/DimProduct/' ,
    DATA_SOURCE = AzureDataLakeStore ,
    FILE_FORMAT = TextFileFormat ,
    REJECT_TYPE = VALUE ,
    REJECT_VALUE = 0
) ;

CREATE TABLE [dbo].[DimProduct]
WITH (DISTRIBUTION = HASH([ProductKey] ) )
AS SELECT * FROM
[dbo].[DimProduct_external] ;

Vedere ancheSee Also

* Piattaforma di strumenti
analitici (PDW) *
 
* Analytics
Platform System (PDW) *
 

 

Panoramica: Sistema della piattaforma di analisiOverview: Analytics Platform System

Usare una tabella esterna per:Use an external table to:

  • Eseguire query sui dati di Hadoop o dell'archiviazione BLOB di Azure con istruzioni Transact-SQLTransact-SQL.Query Hadoop or Azure blob storage data with Transact-SQLTransact-SQL statements.
  • Importare e archiviare dati da Hadoop o Archiviazione BLOB di Azure nella piattaforma di strumenti analitici.Import and store data from Hadoop or Azure blob storage into Analytics Platform System.

Vedere anche CREATE EXTERNAL DATA SOURCE e DROP EXTERNAL TABLE.See also CREATE EXTERNAL DATA SOURCE and DROP EXTERNAL TABLE.

SintassiSyntax

CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ ,...n ] )  
    WITH (
        LOCATION = 'hdfs_folder_or_filepath',  
        DATA_SOURCE = external_data_source_name,  
        FILE_FORMAT = external_file_format_name  
        [ , <reject_options> [ ,...n ] ]  
    )  
[;]  

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

<reject_options> ::=  
{  
    | REJECT_TYPE = value | percentage,  
    | REJECT_VALUE = reject_value,  
    | REJECT_SAMPLE_VALUE = reject_sample_value,

}  

ArgomentiArguments

{ database_name.schema_name.table_name | schema_name.table_name | table_name } è il nome della tabella da creare, composto da una, due o tre parti.{ database_name.schema_name.table_name | schema_name.table_name | table_name } The one to three-part name of the table to create. Per una tabella esterna, solo i metadati della tabella vengono archiviati nella piattaforma di strumenti analitici insieme alle statistiche di base relative al file o alla cartella a cui viene fatto riferimento in Hadoop o Archiviazione BLOB di Azure.For an external table, Analytics Platform System stores only the table metadata along with basic statistics about the file or folder that is referenced in Hadoop or Azure blob storage. I dati effettivi non vengono spostati o archiviati nella piattaforma di strumenti analitici.No actual data is moved or stored in Analytics Platform System.

Importante

Per ottenere prestazioni ottimali, se il driver dell'origine dati esterna supporta un nome in tre parti, è consigliabile specificare il nome in tre parti.For best performance, if the external data source driver supports a three-part name, it is strongly recommended to provide the three-part name.

<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supporta la possibilità di configurare il nome di colonna, il tipo di dati, il supporto dei valori Null e le regole di confronto.<column_definition> [ ,...n ] CREATE EXTERNAL TABLE supports the ability to configure column name, data type, nullability and collation. Non è possibile usare DEFAULT CONSTRAINT nelle tabelle esterne.You can't use the DEFAULT CONSTRAINT on external tables.

Le definizioni di colonna, inclusi i tipi di dati e il numero di colonne, devono corrispondere ai dati nei file esterni.The column definitions, including the data types and number of columns, must match the data in the external files. In caso di mancata corrispondenza, le righe di file verranno rifiutate quando si eseguono query sui dati effettivi.If there's a mismatch, the file rows will be rejected when querying the actual data.

LOCATION = 'folder_or_filepath' specifica la cartella o il percorso e il nome file per i dati effettivi in Hadoop o Archiviazione BLOB di Azure.LOCATION = 'folder_or_filepath' Specifies the folder or the file path and file name for the actual data in Hadoop or Azure blob storage. Il percorso inizia dalla cartella radice.The location starts from the root folder. La cartella radice è il percorso dei dati specificato nell'origine dati esterna.The root folder is the data location specified in the external data source.

Nella piattaforma di strumenti analitici l'istruzione CREATE EXTERNAL TABLE AS SELECT crea il percorso e la cartella, se non esistono.In Analytics Platform System, the CREATE EXTERNAL TABLE AS SELECT statement creates the path and folder if it doesn't exist. CREATE EXTERNAL TABLE non crea il percorso e la cartella.CREATE EXTERNAL TABLE doesn't create the path and folder.

Se si specifica che LOCATION deve essere una cartella, una query PolyBase che effettua selezioni dalla tabella esterna recupererà i file dalla cartella e da tutte le relative sottocartelle.If you specify LOCATION to be a folder, a PolyBase query that selects from the external table will retrieve files from the folder and all of its subfolders. Proprio come Hadoop, PolyBase non restituisce le cartelle nascoste.Just like Hadoop, PolyBase doesn't return hidden folders. Inoltre, non restituisce i file il cui nome file inizia con un carattere di sottolineatura () o un punto (.).It also doesn't return files for which the file name begins with an underline () or a period (.).

In questo esempio, se LOCATION='/webdata/', una query PolyBase restituisce le righe da mydata.txt e mydata2.txt.In this example, if LOCATION='/webdata/', a PolyBase query will return rows from mydata.txt and mydata2.txt. Non restituirà mydata3.txt perché è una sottocartella di una cartella nascosta.It won't return mydata3.txt because it's a subfolder of a hidden folder. Non restituirà _hidden.txt perché è un file nascosto.And it won't return _hidden.txt because it's a hidden file.

Dati ricorsivi per tabelle esterneRecursive data for external tables

Per modificare l'impostazione predefinita e leggere solo dalla directory radice, impostare l'attributo <polybase.recursive.traversal> su 'false' nel file di configurazione core-site.xml.To change the default and only read from the root folder, set the attribute <polybase.recursive.traversal> to 'false' in the core-site.xml configuration file. Questo file si trova in <SqlBinRoot>\PolyBase\Hadoop\Conf with SqlBinRoot the bin root of SQl Server.This file is located under <SqlBinRoot>\PolyBase\Hadoop\Conf with SqlBinRoot the bin root of SQl Server. Ad esempio: C:\\Program Files\\Microsoft SQL Server\\MSSQL13.XD14\\MSSQL\\Binn.For example, C:\\Program Files\\Microsoft SQL Server\\MSSQL13.XD14\\MSSQL\\Binn.

DATA_SOURCE = external_data_source_name specifica il nome dell'origine dati esterna che contiene il percorso dei dati esterni.DATA_SOURCE = external_data_source_name Specifies the name of the external data source that contains the location of the external data. Questo percorso è un cluster Hadoop o un'archiviazione BLOB di Azure.This location is either a Hadoop or Azure blob storage. Per creare un'origine dati esterna, usare CREATE EXTERNAL DATA SOURCE.To create an external data source, use CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name specifica il nome dell'oggetto formato di file esterno che contiene il tipo di file e il metodo di compressione per i dati esterni.FILE_FORMAT = external_file_format_name Specifies the name of the external file format object that stores the file type and compression method for the external data. Per creare un formato di file esterno, usare CREATE EXTERNAL FILE FORMAT.To create an external file format, use CREATE EXTERNAL FILE FORMAT.

Le opzioni REJECT consentono di specificare i parametri di rifiuto che determinano il modo in cui PolyBase gestirà i record dirty recuperati dall'origine dati esterna.Reject Options You can specify reject parameters that determine how PolyBase will handle dirty records it retrieves from the external data source. Un record di dati è considerato "dirty" se i tipi di dati effettivi o il numero di colonne non corrispondono alle definizioni di colonna della tabella esterna.A data record is considered 'dirty' if it actual data types or the number of columns don't match the column definitions of the external table.

Se non si specificano o si modificano i valori di rifiuto, PolyBase usa i valori predefiniti.When you don't specify or change reject values, PolyBase uses default values. Queste informazioni sui parametri di rifiuto vengono archiviate come metadati aggiuntivi quando si crea una tabella esterna con l'istruzione CREATE EXTERNAL TABLE.This information about the reject parameters is stored as additional metadata when you create an external table with CREATE EXTERNAL TABLE statement. Quando un'istruzione SELECT o SELECT INTO SELECT futura seleziona i dati dalla tabella esterna, PolyBase usa le opzioni di rifiuto per determinare il numero o la percentuale di righe che possono essere rifiutate prima che la query effettiva abbia esito negativo.When a future SELECT statement or SELECT INTO SELECT statement selects data from the external table, PolyBase will use the reject options to determine the number or percentage of rows that can be rejected before the actual query fails. La query restituirà risultati (parziali) finché non viene superata la soglia di rifiuto,The query will return (partial) results until the reject threshold is exceeded. quindi ha esito negativo con il messaggio di errore appropriato.It then fails with the appropriate error message.

REJECT_TYPE = value | percentage indica se l'opzione REJECT_VALUE è specificata come valore letterale o percentuale.REJECT_TYPE = value | percentage Clarifies whether the REJECT_VALUE option is specified as a literal value or a percentage.

L'opzione REJECT_VALUE di tipo value indica un valore letterale, non una percentuale.value REJECT_VALUE is a literal value, not a percentage. La query PolyBase avrà esito negativo se il numero di righe rifiutate supera reject_value.The PolyBase query will fail when the number of rejected rows exceeds reject_value.

Ad esempio, se REJECT_VALUE = 5 e REJECT_TYPE = value, la query SELECT di PolyBase avrà esito negativo dopo che sono state rifiutate cinque righe.For example, if REJECT_VALUE = 5 and REJECT_TYPE = value, the PolyBase SELECT query will fail after five rows have been rejected.

L'opzione REJECT_VALUE di tipo percentage indica una percentuale, non un valore letterale.percentage REJECT_VALUE is a percentage, not a literal value. La query PolyBase avrà esito negativo se la percentuale di righe non eseguite supera il valore reject_value.A PolyBase query will fail when the percentage of failed rows exceeds reject_value. La percentuale di righe con esito negativo viene calcolata a intervalli.The percentage of failed rows is calculated at intervals.

REJECT_VALUE = reject_value specifica il valore o la percentuale di righe che possono essere rifiutate prima che la query abbia esito negativo.REJECT_VALUE = reject_value Specifies the value or the percentage of rows that can be rejected before the query fails.

Per REJECT_TYPE = value, reject_value deve essere un numero intero compreso tra 0 e 2.147.483.647.For REJECT_TYPE = value, reject_value must be an integer between 0 and 2,147,483,647.

Per REJECT_TYPE = percentage, reject_value deve essere un valore float compreso tra 0 e 100.For REJECT_TYPE = percentage, reject_value must be a float between 0 and 100.

REJECT_SAMPLE_VALUE = reject_sample_value è un attributo obbligatorio quando si specifica REJECT_TYPE = percentage.REJECT_SAMPLE_VALUE = reject_sample_value This attribute is required when you specify REJECT_TYPE = percentage. Determina il numero di righe che si deve tentare di recuperare prima che PolyBase ricalcoli la percentuale di righe rifiutate.It determines the number of rows to attempt to retrieve before the PolyBase recalculates the percentage of rejected rows.

Il parametro reject_sample_value deve essere un numero intero compreso tra 0 e 2.147.483.647.The reject_sample_value parameter must be an integer between 0 and 2,147,483,647.

Ad esempio, se REJECT_SAMPLE_VALUE = 1000, PolyBase calcola la percentuale di righe con esito negativo dopo che ha tentato di importare 1000 righe dal file di dati esterno.For example, if REJECT_SAMPLE_VALUE = 1000, PolyBase will calculate the percentage of failed rows after it has attempted to import 1000 rows from the external data file. Se la percentuale di righe con esito negativo è inferiore al valore reject_value, PolyBase tenterà di recuperare altre 1000 righe.If the percentage of failed rows is less than reject_value, PolyBase will attempt to retrieve another 1000 rows. Continua a ricalcolare la percentuale di righe con esito negativo dopo aver tentato di importare ognuna delle 1000 righe aggiuntive.It continues to recalculate the percentage of failed rows after it attempts to import each additional 1000 rows.

Nota

Poiché PolyBase calcola la percentuale di righe con esito negativo a intervalli, la percentuale effettiva di tali righe può superare reject_value.Since PolyBase computes the percentage of failed rows at intervals, the actual percentage of failed rows can exceed reject_value.

Esempio:Example:

Questo esempio illustra come le tre opzioni REJECT interagiscono tra loro.This example shows how the three REJECT options interact with each other. Ad esempio, se REJECT_TYPE = percentage, REJECT_VALUE = 30 e REJECT_SAMPLE_VALUE = 100, potrebbe verificarsi il seguente scenario:For example, if REJECT_TYPE = percentage, REJECT_VALUE = 30, and REJECT_SAMPLE_VALUE = 100, the following scenario could occur:

  • PolyBase tenta di recuperare le prime 100 righe di cui 25 avranno esito negativo e 75 esito positivo.PolyBase attempts to retrieve the first 100 rows; 25 fail and 75 succeed.
  • La percentuale di righe con esito negativo viene calcolata come 25%, che è minore del valore di rifiuto pari al 30%.Percent of failed rows is calculated as 25%, which is less than the reject value of 30%. Di conseguenza, PolyBase continuerà a recuperare i dati dall'origine dati esterna.As a result, PolyBase will continue retrieving data from the external data source.
  • PolyBase tenta di caricare le 100 righe successive: questa volta 25 righe hanno esito positivo e 75 righe hanno esito negativo.PolyBase attempts to load the next 100 rows; this time 25 rows succeed and 75 rows fail.
  • Percentuale di righe con esito negativo viene ricalcolata come 50%.Percent of failed rows is recalculated as 50%. La percentuale di righe con esito negativo ha superato il valore di rifiuto del 30%.The percentage of failed rows has exceeded the 30% reject value.
  • La query PolyBase ha esito negativo con il 50% di righe rifiutate dopo aver tentato di restituire le prime 200 righe.The PolyBase query fails with 50% rejected rows after attempting to return the first 200 rows. Si noti che le righe corrispondenti vengono restituite prima che la query PolyBase rilevi che è stata superata la soglia di rifiuto.Notice that matching rows have been returned before the PolyBase query detects the reject threshold has been exceeded.

AutorizzazioniPermissions

Richiede queste autorizzazioni utente:Requires these user permissions:

  • CREATE TABLECREATE TABLE
  • ALTER ANY SCHEMAALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCEALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMATALTER ANY EXTERNAL FILE FORMAT
  • CONTROL DATABASECONTROL DATABASE

Si noti che l'account di accesso che crea l'origine dati esterna deve avere le autorizzazioni necessarie per leggere e scrivere nell'origine dati esterna, che si trova in Hadoop o nell'archiviazione BLOB di Azure.Note, the login that creates the external data source must have permission to read and write to the external data source, located in Hadoop or Azure blob storage.

Importante

L'autorizzazione ALTER ANY EXTERNAL DATA SOURCE concede a qualsiasi entità di sicurezza la possibilità di creare e modificare qualsiasi oggetto origine dati esterna e, di conseguenza, la possibilità di accedere a tutte le credenziali con ambito database nel database.The ALTER ANY EXTERNAL DATA SOURCE permission grants any principal the ability to create and modify any external data source object, and therefore, it also grants the ability to access all database scoped credentials on the database. Questa autorizzazione deve essere considerata con privilegi elevati e quindi essere concessa solo a entità attendibili nel sistema.This permission must be considered as highly privileged, and therefore must be granted only to trusted principals in the system.

Gestione degli erroriError Handling

Durante l'esecuzione dell'istruzione CREATE EXTERNAL TABLE, PolyBase tenta di connettersi all'origine dati esterna.While executing the CREATE EXTERNAL TABLE statement, PolyBase attempts to connect to the external data source. Se il tentativo di connessione non riesce, l'istruzione ha esito negativo e la tabella esterna non viene creata.If the attempt to connect fails, the statement will fail and the external table won't be created. La conferma dell'esito negativo del comando può richiedere almeno un minuto perché PolyBase ritenta la connessione prima di stabilire che la query non riesce.It can take a minute or more for the command to fail since PolyBase retries the connection before eventually failing the query.

Osservazioni generaliGeneral Remarks

Negli scenari di query ad hoc, ad esempio SELECT FROM EXTERNAL TABLE, PolyBase archivia le righe recuperate dall'origine dati esterna in una tabella temporanea.In ad-hoc query scenarios, such as SELECT FROM EXTERNAL TABLE, PolyBase stores the rows that are retrieved from the external data source in a temporary table. Dopo il completamento della query, PolyBase rimuove ed elimina la tabella temporanea.After the query completes, PolyBase removes and deletes the temporary table. Nessun dato permanente viene archiviato nelle tabelle SQL.No permanent data is stored in SQL tables.

Al contrario, nello scenario di importazione, ad esempio SELECT INTO FROM EXTERNAL TABLE, PolyBase archivia le righe recuperate dall'origine dati esterna come dati permanenti nella tabella SQL.In contrast, in the import scenario, such as SELECT INTO FROM EXTERNAL TABLE, PolyBase stores the rows that are retrieved from the external data source as permanent data in the SQL table. La nuova tabella viene creata durante l'esecuzione della query quando PolyBase recupera i dati esterni.The new table is created during query execution when PolyBase retrieves the external data.

PolyBase può eseguire il push di parte del calcolo della query in Hadoop per migliorare le prestazioni della query.PolyBase can push some of the query computation to Hadoop to improve query performance. Questa operazione è chiamata distribuzione del predicato.This action is called predicate pushdown. Per abilitarla, specificare l'opzione del percorso della gestione risorse di Hadoop in CREATE EXTERNAL DATA SOURCE.To enable it, specify the Hadoop resource manager location option in CREATE EXTERNAL DATA SOURCE.

È possibile creare numerose tabelle esterne che fanno riferimento alle stesse o ad altre origini dati esterne.You can create many external tables that reference the same or different external data sources.

Limitazioni e restrizioniLimitations and Restrictions

Poiché non si trovano sotto il controllo di gestione diretto dell'appliance, i dati per una tabella possono essere modificati o rimossi in qualsiasi momento da un processo esterno.Since the data for an external table is not under the direct management control of the appliance, it can be changed or removed at any time by an external process. Per questo motivo, non si garantisce che i risultati delle query in una tabella esterna siano deterministici.As a result, query results against an external table aren't guaranteed to be deterministic. La stessa query può restituire risultati diversi ogni volta che viene eseguita su una tabella esterna.The same query can return different results each time it runs against an external table. Analogamente, una query può non riuscire se i dati esterni vengono spostati o rimossi.Similarly, a query might fail if the external data is moved or removed.

È possibile creare più tabelle esterne che fanno tutte riferimento a origini dati esterne differenti.You can create multiple external tables that each reference different external data sources. Se si eseguono contemporaneamente query in diverse origini dati Hadoop, ogni origine Hadoop deve usare la stessa impostazione di configurazione del server di "connettività Hadoop".If you simultaneously run queries against different Hadoop data sources, then each Hadoop source must use the same 'hadoop connectivity' server configuration setting. Ad esempio, non è possibile eseguire contemporaneamente una query su un cluster Cloudera Hadoop e un cluster Hortonworks Hadoop poiché usano impostazioni di configurazione diverse.For example, you can't simultaneously run a query against a Cloudera Hadoop cluster and a Hortonworks Hadoop cluster since these use different configuration settings. Per le impostazioni di configurazione e le combinazioni supportate, vedere Configurazione della connettività di PolyBase.For the configuration settings and supported combinations, see PolyBase Connectivity Configuration.

Solo queste istruzioni Data Definition Language (DDL) sono consentite per le tabelle esterne:Only these Data Definition Language (DDL) statements are allowed on external tables:

  • CREATE TABLE e DROP TABLECREATE TABLE and DROP TABLE
  • CREATE STATISTICS e DROP STATISTICSCREATE STATISTICS and DROP STATISTICS
  • CREATE VIEW e DROP VIEWCREATE VIEW and DROP VIEW

Costrutti e operazioni non supportati:Constructs and operations not supported:

  • Il vincolo DEFAULT per le colonne di tabelle esterneThe DEFAULT constraint on external table columns
  • Operazioni di eliminazione, inserimento e aggiornamento di Data Manipulation Language (DML)Data Manipulation Language (DML) operations of delete, insert, and update

Limitazioni delle queryQuery limitations

PolyBase può utilizzare al massimo 33.000 file per cartella durante l'esecuzione di 32 query PolyBase simultanee.PolyBase can consume a maximum of 33k files per folder when running 32 concurrent PolyBase queries. Questo numero massimo include i file e le sottocartelle presenti in ogni cartella HDFS.This maximum number includes both files and subfolders in each HDFS folder. Se il livello di concorrenza è inferiore a 32, un utente può eseguire le query PolyBase sulle cartelle in HDFS che contengono più di 33.000 file.If the degree of concurrency is less than 32, a user can run PolyBase queries against folders in HDFS that contain more than 33k files. È consigliabile usare percorsi brevi per i file esterni e non più di 30.000 file per ogni cartella HDFS.We recommend that you keep external file paths short and use no more than 30k files per HDFS folder. Quando si fa riferimento a troppi file, potrebbe verificarsi un'eccezione di memoria insufficiente in Java Virtual Machine (JVM).When too many files are referenced, a Java Virtual Machine (JVM) out-of-memory exception might occur.

Limitazioni della larghezza della tabellaTable width limitations

PolyBase in SQL Server 2016 ha un limite di larghezza di riga di 32 KB, in base alla dimensione massima di una singola riga valida secondo la definizione della tabella.PolyBase in SQL Server 2016 has a row width limit of 32 KB based on the maximum size of a single valid row by table definition. Se la somma dello schema di colonne è maggiore di 32 KB, PolyBase non sarà in grado di eseguire query sui dati.If the sum of the column schema is greater than 32 KB, PolyBase can't query the data.

In Azure Synapse Analytics questa limitazione è stata aumentata a 1 MB.In Azure Synapse Analytics, this limitation has been raised to 1 MB.

Limitazioni dei tipi di datiData type limitations

I tipi di dati seguenti non possono essere usati in tabelle esterne di PolyBase:The following data types cannot be used in PolyBase external tables:

  • geography
  • geometry
  • hierarchyid
  • image
  • text
  • nText
  • xml
  • Qualsiasi tipo definito dall'utenteAny user defined type

BloccoLocking

Blocco condiviso per l'oggetto SCHEMARESOLUTION.Shared lock on the SCHEMARESOLUTION object.

SicurezzaSecurity

I file di dati per una tabella esterna vengono archiviati in Hadoop o nell'archiviazione BLOB di Azure.The data files for an external table are stored in Hadoop or Azure blob storage. Questi file di dati vengono creati e gestiti dai processi dell'utente,These data files are created and managed by your own processes. che sarà responsabile della gestione della sicurezza dei dati esterni.It is your responsibility to manage the security of the external data.

EsempiExamples

R.A. Unire i dati HDFS ai dati della piattaforma di strumenti analiticiJoin HDFS data with Analytics Platform System data

SELECT cs.user_ip FROM ClickStream cs
JOIN User u ON cs.user_ip = u.user_ip
WHERE cs.url = 'www.microsoft.com'
;

B.B. Importare i dati delle righe da HDFS in una tabella della piattaforma di strumenti analitici distribuitaImport row data from HDFS into a distributed Analytics Platform System Table

CREATE TABLE ClickStream_PDW
WITH ( DISTRIBUTION = HASH (url) )
AS SELECT url, event_date, user_ip FROM ClickStream
;

C.C. Importare i dati delle righe da HDFS in una tabella della piattaforma di strumenti analitici replicataImport row data from HDFS into a replicated Analytics Platform System Table

CREATE TABLE ClickStream_PDW
WITH ( DISTRIBUTION = REPLICATE )
AS SELECT url, event_date, user_ip
FROM ClickStream
;

Vedere ancheSee Also