Как получить все текущие разделы дельта-таблицы с помощью pyspark?

Я использую версию delta lake с OSS вместе с Spark 3.0.1. Мой текущий вариант использования требует, чтобы я обнаружил все текущие разделы в заданной дельта-таблице.

Мои данные хранятся в './data/raw' и разделены столбцом sensorId (указанный путь является относительным путем к моему скрипту python).

Я пытаюсь использовать синтаксис SHOW PARTITIONS, как указано в документация. Однако я получаю ошибки.

Вот как выглядит мой код:

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("TestScript").getOrCreate()
df=spark.sql("SHOW PARTITIONS delta.`./data/raw`")
df.show()

Команда spark-submit выглядит следующим образом:

spark-submit --packages io.delta:delta-core_2.12:0.8.0 --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog" test_script.py

И я получаю следующую ошибку:

pyspark.sql.utils.AnalysisException: Database 'delta' not found;

Другой мой вопрос, связанный с этим, заключается в том, предоставит ли SHOW PARTITIONS мне все разделы или это ограничит результат. Если есть предел, как лучше всего обнаружить / получить все разделы дельта-таблицы.


person ganapathy    schedule 22.02.2021    source источник
comment
Вы используете Databricks? Таблица сохраняется как дельта-таблица? Указанный вами путь - это путь, по которому физические файлы паркета сохраняются для дельта-таблицы?   -  person Nikunj Kakadiya    schedule 23.02.2021
comment
речь идет об OSS Delta, а не о Databricks ...   -  person Alex Ott    schedule 23.02.2021
comment
@AlexOtt Следует удалить тег? Я думал, что, поскольку дельта разрабатывается Databricks, я смогу охватить нужную аудиторию.   -  person ganapathy    schedule 24.02.2021


Ответы (1)


Вы можете увидеть разделы двумя способами. Ссылка на предоставленную вами документацию показывает, как это сделать.

  1. Если вы сохранили свои данные в виде дельта-таблицы, вы можете получить информацию о секциях, указав имя таблицы вместо дельта-пути, и она вернет вам информацию о секциях.

    spark.sql (SHOW Partitions schema.tableName) .show ()

  2. Вы также можете использовать параметр, в котором вы указываете путь, по которому находятся физические файлы для таблицы. В вашем случае вы передаете относительный путь в зависимости от того, где присутствует ваш скрипт python, но это не сработает. Вам необходимо передать точный путь к ведру S3 или любому хранилищу, которое вы используете, чтобы оно работало.

    spark.sql (SHOW Partitions delta.`dbfs: / mnt / S3 / tables / data / raw`) .show ()

Чтобы ответить на ваш последний вопрос, покажет ли Показать разделы все разделы. Ответ - да, но если вы проверите это с помощью df.show (), if покажет вам только первые 20 строк.

Если вы хотите увидеть все строки / разделы для таблицы, вы можете подсчитать фрейм данных, а затем передать это в качестве второго параметра методу show.

val count = df.count()
df.show(count, truncate = False)
person Nikunj Kakadiya    schedule 23.02.2021
comment
Пробовал использовать абсолютный путь с префиксом dbfs, но все равно получаю ту же ошибку. Я не уверен, будет ли это решение работать, поскольку я не использую дельту в среде блоков данных. Кроме того, я бы предпочел решение на основе пути местоположения, поскольку наш код будет работать в среде k8, а данные будут находиться в постоянном томе, который будет установлен в определенном месте. - person ganapathy; 24.02.2021
comment
использование абсолютного пути на основе вашего решения не будет работать, даже если вы поставили префикс dbfs. Чтобы это работало, вам необходимо использовать дельту в среде блоков данных. если ваши данные находятся в ведре S3, вы можете подключить свой путь к ведру S3 к блокам данных и использовать его, как я показал в ответе. Вы могли бы получить этот путь из K8 env, потому что он будет в S3. - person Nikunj Kakadiya; 24.02.2021
comment
Мы не используем облачные компоненты в нашем решении. Это будет локальная монтировка fs или nfs. Итак, основываясь на ваших комментариях, я понимаю, что дельта OSS вне среды блоков данных не может поддерживать вышеуказанные функции. Это правильно? - person ganapathy; 24.02.2021
comment
Я не знаю, присутствует ли такая вещь в дельте OSS, поскольку я не пробовал. - person Nikunj Kakadiya; 24.02.2021