我正在尝试过滤具有None行值的PySpark数据帧:
df.select('dt_mvmt').distinct().collect()
[Row(dt_mvmt=u'2016-03-27'),
Row(dt_mvmt=u'2016-03-28'),
Row(dt_mvmt=u'2016-03-29'),
Row(dt_mvmt=None),
Row(dt_mvmt=u'2016-03-30'),
Row(dt_mvmt=u'2016-03-31')]
Run Code Online (Sandbox Code Playgroud)
我可以使用字符串值正确过滤:
df[df.dt_mvmt == '2016-03-31']
# some results here
Run Code Online (Sandbox Code Playgroud)
但这失败了:
df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0
Run Code Online (Sandbox Code Playgroud)
但每个类别肯定都有价值观.这是怎么回事?
我在使用Pyspark Dataframe时遇到了一些麻烦.具体来说,我正在尝试为数据帧创建一个列,这是合并数据帧的两列的结果.
例如
this_dataframe = this_dataframe.withColumn('new_max_price', coalesce(this_dataframe['max_price'],this_dataframe['avg(max_price)']).cast(FloatType()))
Run Code Online (Sandbox Code Playgroud)
此代码的问题是它仍然在某些行中返回值"null".具体来说,我正在运行此代码:
this_dataset.where(col("new_max_price").isNull()).count()
Run Code Online (Sandbox Code Playgroud)
此代码给出了积极的结果.因此,虽然此代码有效,但它不会产生预期的结果.
我发现了一些其他问题(例如从PySpark DataFrame中的非空列中选择值),这些问题被认为是相似的,但由于某种原因,我无法复制他们的结果.
这里有一些基于前面提到的链接的代码:
def coalesce_columns(c1, c2):
if c1 != None and c2 != None:
return c1
elif c1 == None:
return c2
else:
return c1
coalesceUDF = udf(coalesce_columns)
max_price_col = [coalesceUDF(col("max_price"), col("avg(max_price)")).alias("competitive_max_price")]
this_dataset.select(max_price_col).show()
Run Code Online (Sandbox Code Playgroud)
当我尝试执行最后一行来测试我的结果是否正确时,我收到一个错误.
AttributeError:'unicode'对象没有属性'isNull'
基本上问题是,如何使用spark sql函数创建一个合并两个pyspark数据帧列的列?如果这是不可能的,我可以使用什么样的UDF来创建一些我可以附加到另一个数据帧的数据帧列?