Python 如何在pyspark中从SQL中提取列名和列类型

Python 如何在pyspark中从SQL中提取列名和列类型,python,sql,apache-spark,pyspark,pyspark-sql,Python,Sql,Apache Spark,Pyspark,Pyspark Sql,Create查询的sparksql如下- 其中[x]表示x是可选的。如果传递了CREATEsql查询,我希望输出为以下顺序的元组- (db_name, table_name, [(col1 name, col1 type), (col2 name, col2 type), ...]) 那么,有没有任何方法可以通过pysparksql函数实现这一点,或者需要正则表达式的帮助 如果regex有人能帮我使用正则表达式吗?可以通过java\u网关访问非官方API来完成: plan = spark_se

Create查询的sparksql如下-

其中
[x]
表示
x
是可选的。如果传递了
CREATE
sql查询,我希望输出为以下顺序的元组-

(db_name, table_name, [(col1 name, col1 type), (col2 name, col2 type), ...])
那么,有没有任何方法可以通过pysparksql函数实现这一点,或者需要正则表达式的帮助


如果regex有人能帮我使用正则表达式吗?

可以通过
java\u网关访问非官方API来完成:

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
,则访问器的命名也会有所不同。命令可以在这里找到

可以通过
java\u网关访问非官方API来完成:

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
,则访问器的命名也会有所不同。命令可以在这里找到

不是问题的直接解决方案,但在创建查询后是否考虑了
descripe table\u name
语句?不过,最后还是需要将结果解析为所需的结构。在运行CREATE查询之前,我需要col名称和类型。需要检查表是否已存在于DB中,是否具有相同的列名称和类型。列的顺序重要吗?@thebluephantom是的。这不是问题的直接解决方案,但在创建查询后考虑了
descripe table\u name
语句?不过,最后还是需要将结果解析为所需的结构。在运行CREATE查询之前,我需要col名称和类型。需要检查表是否已经存在于DB中,并且具有相同的列名称和类型。列的顺序重要吗?@thebluephantom是的。