PySpark:如何判断数据帧的列类型

时间:2018-01-25 19:19:29

标签: python apache-spark pyspark apache-spark-sql pyspark-sql

假设我们有一个名为df的数据框。我知道有使用df.dtypes的方法。但是我喜欢类似于

的东西

type(123) == int # note here the int is not a string

我想知道是否有类似的东西:

type(df.select(<column_name>).collect()[0][1]) == IntegerType

基本上我想知道从数据帧直接获取类IntegerType, StringType类的对象然后判断它的方法。

谢谢!

2 个答案:

答案 0 :(得分:3)

TL; DR 使用外部数据类型(纯Python类型)来测试值,内部数据类型(DataType子类)来测试模式。

首先 - 你永远不应该使用

type(123) == int

检查处理继承的Python中的类型的正确方法是

isinstance(123, int)

完成此操作后,让我们谈谈

  

基本上我想知道从数据帧直接获取类的对象如IntegerType,StringType然后判断它的方法。

这不是它的工作原理。 DataTypes描述模式(内部表示)而不是值。外部类型是一个普通的Python对象,因此如果内部类型为IntegerType,则外部类型为int,依此类推,根据Spark SQL Programming guide中定义的规则。

IntegerType(或其他DataTypes)实例存在的唯一位置是您的架构:

from pyspark.sql.types import *

df = spark.createDataFrame([(1, "foo")])

isinstance(df.schema["_1"].dataType, LongType)
# True
isinstance(df.schema["_2"].dataType, StringType)
# True

_1, _2 = df.first()

isinstance(_1, int)
# True
isinstance(_2, str)
# True

答案 1 :(得分:1)

如何尝试:

df.printSchema()

这将返回类似的内容:

root
 |-- id: integer (nullable = true)
 |-- col1: string (nullable = true)
 |-- col2: string (nullable = true)
 |-- col3: integer (nullable = true)
 |-- col4: date (nullable = true)
 |-- col5: long (nullable = true)