Как получить все столбцы таблицы за раз в базе данных azure - PullRequest
0 голосов
/ 21 февраля 2020

Мне нужны все столбцы таблицы одновременно, которые присутствуют в конкретной БД в Azure Блок данных. Мне известен подход к поиску сервера sql с помощью следующего запроса. Мне нужна такая же реализация в блоках данных.

select schema_name(tab.schema_id) as schema_name,
    tab.name as table_name, 
    col.column_id,
    col.name as column_name, 
    t.name as data_type,    
    col.max_length,
    col.precision
from sys.tables as tab
    inner join sys.columns as col
        on tab.object_id = col.object_id
    left join sys.types as t
    on col.user_type_id = t.user_type_id
order by schema_name,
    table_name, 
    column_id;

1 Ответ

1 голос
/ 21 февраля 2020

На самом деле есть много способов достичь этого, один из них - поиграть с некоторыми базовыми c python данными, списком и l oop (извините за мой бедный Энгли sh)

Давайте играть ....

1-й вы должны получить все имена таблиц и с тем именем таблицы получить описание таблицы, которые содержат все имена столбцов с типом данных. мы используем 2 spark sql query

1: Table_name = spark.sql("SHOW TABLES FROM default")

(default имя базы данных по умолчанию для базы данных)

результат

+--------+--------------+-----------+ |database| tableName|isTemporary| +--------+--------------+-----------+ | default|convertedtable| false| | default| delta_table| false| | default| display| false| | default| events| false| | default| export_csv| false| | default| flights| false| | default| play_store| false| +--------+--------------+-----------+

2: table_describe = spark.sql("DESCRIBE default.play_store")

результат

+--------------+---------+-------+ | col_name|data_type|comment| +--------------+---------+-------+ | App| string| null| | Category| string| null| | Rating| string| null| | Reviews| string| null| | Size| string| null| | Installs| string| null| | Type| string| null| | Price| string| null| |Content Rating| string| null| | Genres| string| null| | Last Updated| string| null| | Current Ver| string| null| | Android Ver| string| null| +--------------+---------+-------+

Теперь основная часть

Table_name = spark.sql("SHOW TABLES FROM default")
Table_name=Table_name.select('tableName').collect()
mvv_array = [(row.tableName) for row in Table_name]
cnt = 0
for idx,i in enumerate(mvv_array):
  if cnt == 0:
    tmp = spark.sql('DESCRIBE default.'+i).withColumn('table_name',lit(i))
    temp_df = tmp
    cnt = cnt + 1
  else:
    tmp = spark.sql('DESCRIBE default.'+i).withColumn('table_name',lit(i))
    temp_df=temp_df.unionAll(tmp)
temp_df.show()

TADAAAA ... ..

+-----------------+---------+-------+--------------+ | col_name|data_type|comment| table_name| +-----------------+---------+-------+--------------+ | Year| int| null|convertedtable| | Month| int| null|convertedtable| | DayofMonth| int| null|convertedtable| | DayOfWeek| int| null|convertedtable| | DepTime| string| null|convertedtable| | CRSDepTime| int| null|convertedtable| | ArrTime| string| null|convertedtable| | CRSArrTime| int| null|convertedtable| | UniqueCarrier| string| null|convertedtable| | FlightNum| int| null|convertedtable| | TailNum| string| null|convertedtable| |ActualElapsedTime| string| null|convertedtable| | CRSElapsedTime| string| null|convertedtable| | AirTime| string| null|convertedtable| | ArrDelay| string| null|convertedtable| | DepDelay| string| null|convertedtable| | Origin| string| null|convertedtable| | Dest| string| null|convertedtable| | Distance| int| null|convertedtable| | TaxiIn| string| null|convertedtable| +-----------------+---------+-------+--------------+ only showing top 20 rows

Возьмите все, что вам нужно, с нового фрейма данных.

Надеюсь, он выполнит то, что вы хотите.

Если вы найдете его как Ваше решение не забудьте пометить как Ответ и голосование.

...