Как извлечь имя столбца и тип столбца из SQL в pyspark

Запрос Spark SQL для создания похож на это -

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name1 col_type1 [COMMENT col_comment1], ...)]
  USING datasource
  [OPTIONS (key1=val1, key2=val2, ...)]
  [PARTITIONED BY (col_name1, col_name2, ...)]
  [CLUSTERED BY (col_name3, col_name4, ...) INTO num_buckets BUCKETS]
  [LOCATION path]
  [COMMENT table_comment]
  [TBLPROPERTIES (key1=val1, key2=val2, ...)]
  [AS select_statement]

где [x] означает, что x не является обязательным. Я хочу, чтобы вывод был в виде кортежа следующего порядка, если передан запрос CREATE sql -

(db_name, table_name, [(col1 name, col1 type), (col2 name, col2 type), ...])

Итак, есть ли способ сделать это с помощью функций pyspark sql или нужна помощь от регулярного выражения?

Если регулярное выражение, может ли кто-нибудь помочь с регулярным выражением?

Не прямое решение вашей проблемы, но рассмотрели оператор describe table_name после создания запроса? Тем не менее, в конце концов вам нужно разобрать результат в нужную структуру

w4bo 30.05.2019 22:09

Мне нужно имя и тип столбца перед запуском запроса CREATE. Требуется проверить, присутствует ли таблица уже в БД или нет с тем же именем и типом столбца.

Anirban Nag 'tintinmj' 30.05.2019 22:28

Важен ли порядок столбцов?

thebluephantom 30.05.2019 23:53

@thebluephantom да, очень.

Anirban Nag 'tintinmj' 31.05.2019 12:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
296
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это можно сделать, обратившись к неофициальному API через java_gateway:

plan = spark_session._jsparkSession.sessionState().sqlParser().parsePlan("CREATE TABLE foobar.test (foo INT, bar STRING) USING json")
print(f"database: {plan.tableDesc().identifier().database().get()}")
print(f"table: {plan.tableDesc().identifier().table()}")
# perhaps there is a better way to convert the schemas, using JSON string hack here
print(f"schema: {StructType.fromJson(json.loads(plan.tableDesc().schema().json()))}")

Выход:

database: foobar
table: test
schema: StructType(List(StructField(foo,IntegerType,true),StructField(bar,StringType,true)))

Обратите внимание, что database().get() завершится ошибкой, если база данных не определена, и параметр Scala должен обрабатываться правильно. Кроме того, если вы используете CREATE TEMPORARY VIEW, методы доступа называются по-другому. Команды можно найти здесь https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/ddl.scala#L38https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/ddl.scala#L58

Другие вопросы по теме