如何在 Spark SQL 中获取列的数据类型?

Posted

技术标签:

【中文标题】如何在 Spark SQL 中获取列的数据类型?【英文标题】:How to get datatype of a column in spark SQL? 【发布时间】:2016-03-18 01:41:40 【问题描述】:

我想找出一个表的每一列的数据类型?

例如,假设我的表是使用这个创建的:

create table X
(
col1 string,
col2 int,
col3 int
)

我想做一个输出如下的命令:

column datatype
col1  string
col2  int

有这个命令吗?最好在 SparkSQL 中。但是,如果没有,那么如何使用另一种方式获取这些数据?我正在使用 spark sql 查询配置单元表。也许通过 HIVE 中的元数据?谢谢你。

【问题讨论】:

【参考方案1】:

您可以将 Hive 表读取为 DataFrame 并使用 printSchema() 函数。

在 pyspark repl 中:

from pyspark.sql import HiveContext
hive_context = HiveContext(sc)
table=hive_context("database_name.table_name") 
table.printSchema()

在 spark-shell repl(Scala) 中类似:

import org.apache.spark.sql.hive.HiveContext
val hiveContext = new org.apache.spark.sql.hive.HiveContext
val table=hiveContext.table("database_name.table_name")
table.printSchema

【讨论】:

酷,谢谢。有没有办法只使用 sql 语法来做到这一点?我们有一些内部工具,其中 spark 对象不向用户公开 - 只有 SQL 命令。谢谢。 我们需要有 HiveContext 才能从 Hive 读取表。我不确定使用 SqlContext 我们是否可以做同样的事情。 pyspark 示例缺少table 函数。 pyspark 中的第 3 行应该是:table=hive_context.table("database_name.table_name") 没有这个你会得到一个错误。 df.dtypes 它将给出数据框列名和相应的数据类型。 所有 Varchar 都变成 'string' 有没有办法用不同的 varchar 获取 dtypes?例如:我想区分 varchar(1)、varchar(10) 等等...【参考方案2】:

您可以使用 desc <db_name>.<tab_name> (或者) spark.catalog.listColumns("<db>.<tab_name>")

Example:

spark.sql("create table X(col1 string,col2 int,col3 int)")

Using desc to get column_name and datatype:

spark.sql("desc default.x").select("col_name","data_type").show()

//+--------+---------+
//|col_name|data_type|
//+--------+---------+
//|    col1|   string|
//|    col2|      int|
//|    col3|      int|
//+--------+---------+

Using spark.catalog to get column_name and data_type:

spark.catalog.listColumns("default.x").select("name","dataType")show()

//+----+--------+
//|name|dataType|
//+----+--------+
//|col1|  string|
//|col2|     int|
//|col3|     int|
//+----+--------+

【讨论】:

【参考方案3】:

在 scala 中:为您的表创建一个数据框并尝试以下操作:

df.dtypes

你的结果:

数组((PS_PROD_DESC,StringType), (PS_OPRTNG_UNIT_ID,StringType),...)

【讨论】:

以上是关于如何在 Spark SQL 中获取列的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

Databricks/Spark SQL - 如何在地图类型字段中获取数据

在 Spark 中获取上周一

指定列的 Spark sql 问题

获取 Apache spark 数据集中包含的列的列数据类型

如何提高具有数组列的 DataFrame 的 Spark SQL 查询性能?

如何在 Spark 流数据框中获取列的滞后?