【问题标题】:How to get datatype of a column in spark SQL?如何在 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 中的元数据?谢谢你。

【问题讨论】:

    标签: apache-spark hive apache-spark-sql


    【解决方案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),...)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 2013-12-14
        • 2020-12-29
        相关资源
        最近更新 更多