Я прописал файлы паркета по такому пути в контейнере хранения BLOB-объектов: https://<my_blob_storage_accnt>.dfs.core.windows.net/current-snapshot/businesspartner=P1
, https://<my_blob_storage_accnt>.dfs.core.windows.net/current-snapshot/businesspartner=P2
и т. д.
Когда я читаю файлы паркета в Synapse SQL с помощью OPENROWSET
, как показано ниже:
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK 'https://<my_blob_storage_accnt>.dfs.core.windows.net/current-snapshot/**',
FORMAT = 'PARQUET'
) AS [result]
Я понял, что в выходной таблице НЕТ столбца businesspartner
. Когда я использовал Spark/PySpark, я смог сделать что-то вроде ниже, чтобы (источник) увидеть businesspartner
в виде столбца:
val df = sparkSession.read
.option("basePath", path)
.parquet(path + "/businesspartner=*/*.parquet")
Я осмотрелся и нашел эти ресурсы (1 , 2 и 3 ). Ближайшие подходы, которые я вижу, которые не совсем естественны для такого человека, как я, - это этот подход, который предполагает использование WHERE filepath() = 'P1'
или, как предлагает этот подход, явно указать отдельные пути к большим двоичным объектам для каждого раздела, чтобы фильтровать их, как показано ниже:
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK (
'https://<my_blob_storage_accnt>.dfs.core.windows.net/current-snapshot/businesspartner=P1',
'https://<my_blob_storage_accnt>.dfs.core.windows.net/current-snapshot/businesspartner=P2'
),
FORMAT = 'PARQUET'
) AS [result]
Есть ли параметр в OPENROWSET
или какой-либо другой подход, который позволил бы мне кратко прочитать весь набор разделов как столбец в таблице результатов, из которого я могу использовать WHERE
для фильтрации businesspartners
, если захочу?
Заранее благодарю за ответы/предложения!
@Bohemian - Спасибо за комментарий. :)
Предполагая, что вы используете SQL Serverless, вы можете передать параметр filepath
, как показано ниже (как описано здесь).
SELECT
TOP 100 *,
[result].filepath() AS WholePath,
[result].filepath(1) AS Wildcard1,
[result].filepath(2) AS Wildcard2
FROM
OPENROWSET(
BULK 'https://<my_blob_storage_accnt>.dfs.core.windows.net/current-snapshot/*=*/.parquet',
FORMAT = 'PARQUET'
) AS [result]
WHERE [result].filepath(2) IN ('P1', 'P2')
Спасибо, @Мартин Смит. Ваше предложение работает (хотя я бы хотел, чтобы OPENROWSET
сделал его параметром). :) Запрос, который я в итоге использовал (поскольку он немного отличался от того, что вы указали выше), был таким: SELECT TOP 100 , [result].filepath() AS WholePath, [result].filepath(1) AS Wildcard1 , [result].filepath(2) AS Wildcard2 FROM OPENROWSET( BULK 'https://<my_blob_storage_accnt>.dfs.core.windows.net/current-snapshot/*=*/.parquet', FORMAT = 'ПАРКЕТ' ) AS [результат] ГДЕ [результат].filepath(2) IN ('P1', 'P2')
Мои краткие исследования показывают, что вас облили. OPENROWSET, похоже, не возвращает метаданные, такие как имя исходного файла, например, в виде дополнительного столбца. Рассмотрите возможность написания сценария, который принимает каталог (с подстановкой) и циклически перебирает файлы, выполняя запрос для каждого файла, добавляя столбцы в сценарий к выходным данным на основе имени исходного файла.