Scala 将数据集[数据集[列]]展平到数据集[列]
我试图捕获数据库中所有表的元数据。我正在使用Scala 将数据集[数据集[列]]展平到数据集[列],scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我试图捕获数据库中所有表的元数据。我正在使用spark.catalogapi来提取元数据。我写了下面的方法 def getColumns(tables:Dataset[Table]): Dataset[Column] = { tables.map(table => spark.catalog.listColumns(table.name)) } 此方法返回Dataset[Dataset[Colums]]。如何将其转换为Dataset[Column],以便将其保存为配置单元中的表?请推
spark.catalog
api来提取元数据。我写了下面的方法
def getColumns(tables:Dataset[Table]): Dataset[Column] = {
tables.map(table => spark.catalog.listColumns(table.name))
}
此方法返回
Dataset[Dataset[Colums]]
。如何将其转换为Dataset[Column]
,以便将其保存为配置单元中的表?请推荐是否有其他有效的方法来捕获表的所有元数据。谢谢您的回复。我需要捕获所有数据库表的所有列(如#2.Full info中所示),然后将其存储在一个配置单元表中。我可以在foreach循环中完成它,但它花费的时间太长,最终耗尽了驱动程序内存。我在一个数据库中有4000多个表。所以我想在表列表上运行一个映射,并将表名传递给spark.catalog.listColumns,然后将结果保存到dataframe中,我可以将其写入配置单元。但映射输出将是Dataset[Dataset[Column]]。所以我想将其展平/转换为Dataset[Column],请参见Hive Metastore。表:DBS、TBL、SDS、分区。。。所有表格=55。编辑我的答案。增加项目3。关于数据库表中列的所有信息。在您的方法中,请尝试使用flatMap。
// 1. only column name
val c1 = spark.catalog.listColumns("database-name.table-name").select('name)
// c1: org.apache.spark.sql.DataFrame = [name: string]
c1.printSchema
// root
// |-- name: string (nullable = true)
// 2. Full info
val c1 = spark.catalog.listColumns("database-name.table-name")
// c1: org.apache.spark.sql.Dataset[org.apache.spark.sql.catalog.Column] = [name:
string, description: string ... 4 more fields]
c1.printSchema
// root
// |-- name: string (nullable = true)
// |-- description: string (nullable = true)
// |-- dataType: string (nullable = true)
// |-- nullable: boolean (nullable = false)
// |-- isPartition: boolean (nullable = false)
// |-- isBucket: boolean (nullable = false)
// 3. All info about columns in tables database
import org.apache.spark.sql.functions._
val dbName = "set database name"
val listTables = spark.catalog.listTables(dbName)
.select('name).as[String]
.collect().toList
val listDF = listTables.map(t => {
val colsDF = spark.catalog.listColumns(dbName, t)
.withColumn("namneTable", lit(t))
.withColumn("dbName", lit(dbName))
colsDF
})
val resDF = listDF.reduce(_ union _)
resDF.printSchema
// root
// |-- name: string (nullable = true)
// |-- description: string (nullable = true)
// |-- dataType: string (nullable = true)
// |-- nullable: boolean (nullable = false)
// |-- isPartition: boolean (nullable = false)
// |-- isBucket: boolean (nullable = false)
// |-- namneTable: string (nullable = false)
// |-- dbName: string (nullable = false)
resDF.write.format("parquet").saveAsTable(.....)