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