验证pyspark数据帧中列的数据类型

时间:2017-09-10 20:42:14

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

我有3列的pyspark数据帧。 hive表'test1'的DDL都具有字符串数据类型。 所以如果我做df.printSchema都是字符串数据类型,如下所示,

>>> df = spark.sql("select * from default.test1")
>>> df.printSchema()                                                                                                                                                                     
root                                                                                                                                                                                       
 |-- c1: string (nullable = true)                                                                                                                                            
 |-- c2: string (nullable = true)                                                                                                                                        
 |-- c3: string (nullable = true)  

+----------+--------------+-------------------+                                                                                                                 
|c1        |c2            |c3                 |                                                                                                                 
+----------+--------------+-------------------+                                                                                                                 
|April     |20132014      |4                  |                                                                                                                 
|May       |20132014      |5                  |                                                                                                                 
|June      |abcdefgh      |6                  |                                                                                                                 
+----------+--------------+-------------------+ 

现在我想只过滤那些'c2'列中整数类型的记录。 所以基本上我只需要前2条整数类型的记录,如'20132014'。并排除其他记录。

1 个答案:

答案 0 :(得分:2)

在一行中:

df.withColumn("c2", df["c2"].cast("integer")).na.drop(subset=["c2"])

如果c2不是有效整数,则它将为NULL并在后续步骤中删除。

不改变类型

valid = df.where(df["c2"].cast("integer").isNotNull())
invalid = df.where(df["c2"].cast("integer").isNull())