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|
+----+-----------+-----+
【问题讨论】:
null
和 NaN
不是一回事。您可以使用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 的用户定义函数不起作用