Pyspark SQL选择列为NaN的数据[重复]

Posted

技术标签:

【中文标题】Pyspark SQL选择列为NaN的数据[重复]【英文标题】:Pyspark SQL select data where a column is NaN [duplicate] 【发布时间】:2020-03-23 19:16:07 【问题描述】:

如何在 pyspark 中仅选择某一列具有 NaN 值的行?

设置

import numpy as np
import pandas as pd


# pyspark
import pyspark
from pyspark.sql import functions as F 
from pyspark.sql.types import *
from pyspark import SparkConf, SparkContext, SQLContext


spark = pyspark.sql.SparkSession.builder.appName('app').getOrCreate()
sc = spark.sparkContext
sqlContext = SQLContext(sc)
sc.setLogLevel("INFO")


# data
dft = pd.DataFrame(
    'Code': [1, 2, 3, 4, 5, 6],
    'Name': ['Odeon', 'Imperial', 'Majestic',
             'Royale', 'Paraiso', 'Nickelodeon'],
    'Movie': [5.0, 1.0, np.nan, 6.0, 3.0, np.nan])


schema = StructType([
    StructField('Code',IntegerType(),True),
    StructField('Name',StringType(),True),
    StructField('Movie',FloatType(),True),

    ])

sdft = sqlContext.createDataFrame(dft, schema)
sdft.createOrReplaceTempView("MovieTheaters")
sdft.show()

我的尝试

spark.sql("""
select * from MovieTheaters where Movie is null
""").show()

+----+----+-----+
|Code|Name|Movie|
+----+----+-----+
+----+----+-----+

我得到 EMPTY 输出,如何解决这个问题?

预期输出:

+----+-----------+-----+
|Code|       Name|Movie|
+----+-----------+-----+
|   3|   Majestic|  NaN|
|   6|Nickelodeon|  NaN|
+----+-----------+-----+

【问题讨论】:

nullNaN 不是一回事。您可以使用isnan 函数。试试这个:spark.sql("select * from MovieTheaters where isnan(Movie)").show() 【参考方案1】:

如果您想从数据框中获取 np.nan 值,请使用以下代码:

>>> spark.sql("""select * from MovieTheaters where Movie = 'NaN' """).show()
+----+-----------+-----+
|Code|       Name|Movie|
+----+-----------+-----+
|   3|   Majestic|  NaN|
|   6|Nickelodeon|  NaN|
+----+-----------+-----+

【讨论】:

起初,我认为这是错误的(由于数据类型不匹配),但令人惊讶的是它有效..? @pault,我也是这么想的。 我的猜测是,spark 在比较不同类型时会进行隐式转换,因此字符串 "NaN" 被强制转换,导致浮点 NaN

以上是关于Pyspark SQL选择列为NaN的数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果 pyspark 中不存在,则从数据中选择键列为 null

pyspark:用于确定 NaN 或 Null 的用户定义函数不起作用

根据表 B pyspark 从表 A 中选择条目 [重复]

如何在 Spark SQL 中以多列为中心?

在 pyspark sql 的连接中重复使用相同的数据框视图

Pyspark SQL拆分数据框行的记录[重复]