Ошибка Polybase from Parquet: Невозможно привести Java.lang. - PullRequest
0 голосов
/ 17 апреля 2019

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

Сначала я создал внешнюю таблицу в SQL для указания на файл Parquet, а затем загрузил с помощью CTAS.Независимо от того, какой тип данных я использую в SQL, это дает мне ошибку приведения типа.Я пробовал DECIMAL, NUMERIC, FLOAT.Но загрузка VARCHAR работает нормально.

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

Кроме того, я попробовал и 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)

Лазурные шаги:

  1. Загрузил файл Parquet в BLOB-объект Azure
  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 Ответ

0 голосов
/ 21 апреля 2019

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

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

Если вы измените DECIMAL (8,2) на BIGINT, тогда ваши данные будут загружены.

В качестве альтернативы, запишите свои значения данных как двойные, добавив десятичную точку (101.0, 102.0, 103.0), затем вы можете прочитать их, изменив DECIMAL (8,2) на DOUBLE PRECISION или даже FLOAT, поскольку они маленькие и точные цифры в этом случае.

(шучу про пиво)

...