2016-03-21 11 views
4

SQL Veri Ambarı'nda (düzenleyiciler lütfen bunu değiştirmeyin, gerçek adı bkz: here) Bu gibi görünen bir JobCandidate_ext dış tablom var.SQL Veri Ambarı'nda Harici Tablolar oluştururken/seçerken gömülü yeni satırları işleme

CREATE EXTERNAL TABLE [HumanResources].[JobCandidate_ext](
    [JobCandidateID] int, 
    [BusinessEntityID] int, 
    [Resume] Varchar(8000), 
    [ModifiedDate] Datetime 
) 
WITH (
    LOCATION='/[HumanResources].[JobCandidate]/data.txt', 
    DATA_SOURCE=AzureStorage, 
    FILE_FORMAT=TextFile) 
GO 

kolon [Resume]here açıklandığı gibi, SQL Server ancak SQL Veri Ambarı XML türlerinde bir XML tip varchar(8000) dönüştürülmesi gerekir oldu.

Verileri bir blob dosyasına dışa aktarmak ve daha sonra bir dış tablo oluşturmak için düz bir dosya data.txt kullanıyorum.

[Resume] sütununda satır başı (XML dosyasından beklendiği gibi) vardır ve böylece bir SELECT * FROM [HumanResources].[JobCandidate_ext] çalıştırdığınızda hata alırsınız. Bu durumda:

Query aborted-- the maximum reject threshold (0 rows) was reached while reading from an external source: 1 rows rejected out of total 2 rows processed.
(/[HumanResources].[JobCandidate]/data.txt)Column ordinal: 0, Expected data type: INT, Offending value: some text .... (Column Conversion Error), Error: Error converting data type NVARCHAR to INT.

Ben here açıklandığı gibi dış tablo oluştururken bir satır sınırlayıcı yapılandırmak olamayacağını biliyoruz.

The row delimiter must be UTF-8 and supported by Hadoop’s LineRecordReader. The row delimiter must be either '\r', '\n', or '\r\n'. These are not user-configurable.

Ve dış tablodan satırları seçerken bu hatayı her sütun sahada tırnak koymak denerseniz: No closing string delimiter.

Query aborted-- the maximum reject threshold (0 rows) was reached while reading from an external source: 1 rows rejected out of total 1 rows processed.
(/[HumanResources].[JobCandidate]/data.txt)Column ordinal: 2, Expected data type: VARCHAR(8000) collate SQL_Latin1_General_CP1_CI_AS, Offending value: 'ShaiBassli (Tokenization failed), Error: No closing string delimiter.

Bu sorunun üstesinden gelmenin bir yolu var mı?

+0

Maalesef, dize sınırlayıcısı ve satır sınırlayıcısının verilerinde hiç görünmeyen karakterler olmasını sağlamak dışında, bu soruna geçici bir yol olduğunu düşünmüyorum. Lütfen oy verin: https://feedback.azure.com/forums/307516-sql-data-warehouse/suggestions/10600132-polybase-allow-line-ends-within-qualified-text-f – GregGalloway

cevap

1

Günümüzde PolyBase, alanlar içinde satır veya alan sınırlayıcılarına izin vermez, yani bu karakterlerden kurtulmanıza izin vermez. Greg'in belirttiği gibi, bu işleve oy verebilirsiniz: https://feedback.azure.com/forums/307516-sql-data-warehouse/suggestions/10600132-polybase-allow-line-ends-within-qualified-text-f

Bu sınırlamayı geçici olarak çözmek için, PolyBase ile okumadan önce istenmeyen karakterleri değiştirmek için verileri önceden (örneğin sed veya tr kullanarak) işleyebilirsiniz. Veya satır ve alan sınırlayıcılarıyla tamamen uğraşmaktan kaçınmak için RCFile/ORC/Parke gibi diğer polybase destekli dosya formatlarına geçiş yapabilirsiniz.

İlgili konular