scala - 将数据集 [数据集 [列]] 展平为数据集 [列]
问题描述
我正在尝试捕获数据库所有表的元数据。我正在使用spark.catalog
api 来提取元数据。我写了以下方法
def getColumns(tables:Dataset[Table]): Dataset[Column] = {
tables.map(table => spark.catalog.listColumns(table.name))
}
此方法返回Dataset[Dataset[Colums]]
. 如何将其转换为Dataset[Column]
可以保存为 hive 中的表?请推荐是否有任何其他有效的方法来捕获所有表的元数据。
解决方案
// 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(.....)
推荐阅读
- c# - 将 .NET Framework 项目升级到 .NET 5 时,将业务逻辑迁移到 .NET Standard 2.0 作为中间地带是否有意义?
- windows - 未找到 wmic 终止进程
- javascript - Vuejs 3 和 laravel:组件缺少模板或渲染功能
- r - 当一列具有重复字符串时,如何合并 R 数据框中的两行(或多行)?
- machine-learning - 是否应该将确定性模型训练拆分为训练数据集、测试数据集?
- ios - 将存档发送到 App Store Connect 时出错
- reactjs - material-ui dropzone 文件在验证时拒绝
- node.js - Mongoose 聚合图
- python - 如何合并和求和多索引数据帧
- r - 在 R 中安装“aspace”包