如何在 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 - 如何在地图类型字段中获取数据
获取 Apache spark 数据集中包含的列的列数据类型