Ошибка Polybase из Parquet: не удается привести Java.lang.Удвоить до

#pandas #parquet #azure-sqldw #pyarrow #polybase

#панды #паркет #azure-sqldw #пиэрроу #полиоснование

Вопрос:

Загружая хранилище данных Azure через Polybase, я читаю файлы Parquet, которые находятся в Azure Blob.

Сначала я создал внешнюю таблицу в SQL, чтобы указать на файл Parquet, а затем загрузил с помощью CTA. Независимо от того, какой тип данных я использую в SQL, он выдает мне ошибку приведения к этому типу. Я пробовал ДЕСЯТИЧНЫЕ, ЧИСЛОВЫЕ, С ПЛАВАЮЩЕЙ ЗАПЯТОЙ. Но загрузка VARCHAR работает нормально.

Я подозреваю, что это как-то связано с тем, как был создан файл Parquet, который находится из фрейма данных Python Pandas, с использованием df.to_parquet и использованием pyarrow . Копаясь в исходном коде и экспериментируя, я вижу, что данные типа данных, когда они находятся в стрелке (шаг перед паркетом), удваиваются. Может быть, именно поэтому?

Кроме того, я пробовал как Gzip, так и Snappy в качестве типов сжатия при создании файла, а при создании внешней таблицы SQL — без кубиков.

Схожу с ума от этого. Есть идеи?

Шаги для воспроизведения

Окружающая среда:

 conda create -n testenv python=3.6

conda install -n testenv -c conda-forge pyarrow

conda list -n testenv

# Name                    Version                   Build  Channel
arrow-cpp                 0.13.0           py36hee3af98_1    conda-forge
boost-cpp                 1.68.0            h6a4c333_1000    conda-forge
brotli                    1.0.7             he025d50_1000    conda-forge
ca-certificates           2019.3.9             hecc5488_0    conda-forge
certifi                   2019.3.9                 py36_0    conda-forge
gflags                    2.2.2             he025d50_1001    conda-forge
glog                      0.3.5                h6538335_1
intel-openmp              2019.3                      203
libblas                   3.8.0                     5_mkl    conda-forge
libcblas                  3.8.0                     5_mkl    conda-forge
liblapack                 3.8.0                     5_mkl    conda-forge
libprotobuf               3.7.1                h1a1b453_0    conda-forge
lz4-c                     1.8.1.2              h2fa13f4_0
mkl                       2019.3                      203
numpy                     1.16.2           py36h8078771_1    conda-forge
openssl                   1.1.1b               hfa6e2cd_2    conda-forge
pandas                    0.24.2           py36h6538335_0    conda-forge
parquet-cpp               1.5.1                         2    conda-forge
pip                       19.0.3                   py36_0
pyarrow                   0.13.0           py36h8c67754_0    conda-forge
python                    3.6.8                h9f7ef89_7
python-dateutil           2.8.0                      py_0    conda-forge
pytz                      2019.1                     py_0    conda-forge
re2                       2019.04.01       vc14h6538335_0  [vc14]  conda-forge
setuptools                41.0.0                   py36_0
six                       1.12.0                py36_1000    conda-forge
snappy                    1.1.7             h6538335_1002    conda-forge
sqlite                    3.27.2               he774522_0
thrift-cpp                0.12.0            h59828bf_1002    conda-forge
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.15.26706          h3a45250_0
wheel                     0.33.1                   py36_0
wincertstore              0.2              py36h7fe50ca_0
zlib                      1.2.11            h2fa13f4_1004    conda-forge
zstd                      1.3.3                    vc14_1    conda-forge
 

Python:

 >>> import pandas as pd
>>> df = pd.DataFrame({'ticker':['AAPL','AAPL','AAPL'],'price':[101,102,103]})
>>> df
  ticker  price
0   AAPL    101
1   AAPL    102
2   AAPL    103
>>> df.to_parquet('C:/aapl_test.parquet',engine='pyarrow',compression='snappy',index=False)
 

Шаги Azure:

  1. Загрузил файл Parquet в Azure Blob
  2. Использование хранилища данных Azure Gen2, размер: DW400c
  3. В соответствии с документами и учебным пособием были созданы УЧЕТНЫЕ ДАННЫЕ В ОБЛАСТИ БАЗЫ ДАННЫХ, ВНЕШНИЙ ИСТОЧНИК ДАННЫХ и ФОРМАТ ВНЕШНЕГО ФАЙЛА

Код SQL:

 CREATE EXTERNAL FILE FORMAT [ParquetFileSnappy] WITH (
    FORMAT_TYPE = PARQUET, 
    DATA_COMPRESSION = N'org.apache.hadoop.io.compress.SnappyCodec'
)
GO

CREATE EXTERNAL DATA SOURCE [AzureBlobStorage] WITH (
    TYPE = HADOOP, 
    LOCATION = N'wasbs://[redacted: containerName]@[redacted: storageAccountName].blob.core.windows.net', 
    CREDENTIAL = [AzureQuantBlobStorageCredential] -- created earlier
)
GO

CREATE EXTERNAL TABLE ext.technicals(
    [ticker] VARCHAR(5) NOT NULL ,
    [close_px] DECIMAL(8,2) NULL
) WITH (
    LOCATION='/aapl_test.parquet', 
    DATA_SOURCE=AzureBlobStorage, 
    FILE_FORMAT=ParquetFileSnappy 
);

CREATE TABLE [dbo].TechnicalFeatures
WITH
( 
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
)
AS SELECT * FROM [ext].technicals
OPTION (LABEL = 'CTAS : Load [dbo].[TechnicalFeatures]')
;
 

И вот ошибка:

 Msg 106000, Level 16, State 1, Line 20
HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException: class java.lang.Long cannot be cast to class parquet.io.api.Binary (java.lang.Long is in module java.base of loader 'bootstrap'; parquet.io.api.Binary is in unnamed module of loader 'app')
 

Редактировать:
Также пробовал использовать fastparquet вместо pyarrow , та же ошибка.

Комментарии:

1. @wesm это ошибка с pyarrow?

2. Пожалуйста, подробно изложите следующее: СОЗДАТЬ ВНЕШНИЙ ИСТОЧНИК ДАННЫХ T-SQL вы можете там, где написано: DATA_SOURCE=AzureBlobStorage, — я создал это ранее FILE_FORMAT=ParquetFileSnappy — я создал это ранее

3. @MikeUbezziMSFT только что обновил пример другими фрагментами SQL

4. Только изменение и повторный запуск: TYPE = HADOOP TYPE = BLOB_STORAGE для CREATE EXTERNAL DATA SOURCE .

5. Parse error at line: 3, column: 9: Incorrect syntax near 'BLOB_STORAGE'. Не работает

Ответ №1:

Я повторил создание вашего файла на Python … ты должен мне пиво за боль и страдания, причиненные установкой Anaconda 😉

При проверке файла с помощью parquet-tools проблема заключается в том, что ваши значения данных записываются как длинные целые числа (101,102,103), но вы пытаетесь отобразить их как десятичные дроби в инструкции Create External Table.

Если вы измените ДЕСЯТИЧНОЕ число (8,2) на BIGINT, то ваши данные будут загружены.

В качестве альтернативы, запишите свои значения данных как удвоенные, добавив десятичную точку (101,0, 102,0, 103,0), затем вы можете прочитать их, изменив ДЕСЯТИЧНУЮ (8,2) на ДВОЙНУЮ ТОЧНОСТЬ или даже с плавающей запятой, поскольку в этом случае они являются маленькими и точными числами.

(просто шучу насчет пива)

Комментарии:

1. Кстати, есть альтернатива parquet-tools, которую я только что протестировал и обнаружил, что она работает очень хорошо. Паркет. В Net project есть утилита с именем PARQ. Это .Net Core, поэтому он должен работать в Windows, Linux и OSX. Команда для просмотра схемы файла Parquet — «parq schema path-to-file». github.com/elastacloud/parquet-dotnet/blob/master/doc/parq.md