Python 如何替换PySpark数据帧中的无穷大
似乎不支持替换无穷大值。我尝试了下面的代码,但它不起作用。还是我遗漏了什么Python 如何替换PySpark数据帧中的无穷大,python,pandas,apache-spark,pyspark,apache-spark-sql,Python,Pandas,Apache Spark,Pyspark,Apache Spark Sql,似乎不支持替换无穷大值。我尝试了下面的代码,但它不起作用。还是我遗漏了什么 a=sqlContext.createDataFrame([(None, None), (1, np.inf), (None, 2)]) a.replace(np.inf, 10) 或者我必须采取痛苦的路线:将PySpark数据帧转换为pandas数据帧,替换无穷大的值,然后将其转换回PySpark数据帧 似乎不支持替换无穷大值 实际上,它看起来像一个Py4J bug,而不是replace本身的问题。看 作为一种解决方
a=sqlContext.createDataFrame([(None, None), (1, np.inf), (None, 2)])
a.replace(np.inf, 10)
或者我必须采取痛苦的路线:将PySpark数据帧转换为pandas数据帧,替换无穷大的值,然后将其转换回PySpark数据帧
似乎不支持替换无穷大值
实际上,它看起来像一个Py4J bug,而不是replace
本身的问题。看
作为一种解决方法,您可以尝试UDF(慢速选项):
或者像这样的表达:
def replace_infs(c, v):
is_infinite = c.isin([
lit("+Infinity").cast("double"),
lit("-Infinity").cast("double")
])
return when(c.isNotNull() & is_infinite, v).otherwise(c)
df.withColumn("x1", replace_infs(col("y"), lit(-99))).show()
## +----+--------+-----+
## | x| y| x1|
## +----+--------+-----+
## |null| null| null|
## | 1.0|Infinity|-99.0|
## |null| 2.0| 2.0|
## +----+--------+-----+
为什么
UDF
s比表达式慢?@AlbertoBonsanto因为DataFrame
不是Python对象,它需要一个完整的往返过程。@AlbertoBonsanto另一个方面,不是PySpark特有的,就是UDF只是优化器的黑盒。这在这里并不重要,但一般来说,这意味着您无法对需要UDF的操作进行推理。最后,据我所知,内部表示并不使用标准的Scala类型。因此,即使是在Scala或Java中,您也可能更喜欢直接使用表达式而不使用UDF。谢谢,问题是有时我很难弄清楚如何使用表达式而不是UDF
,我问这个问题是因为我有一个代码,它使用UDFs
将一个字母数组转换成SparseVector
,而这个代码从来没有finished@KevinGhaboosi这是由于类型不匹配。Spice不将Python整数看作是双/浮列的有效值。修正了(谢谢你的编辑!)。
def replace_infs(c, v):
is_infinite = c.isin([
lit("+Infinity").cast("double"),
lit("-Infinity").cast("double")
])
return when(c.isNotNull() & is_infinite, v).otherwise(c)
df.withColumn("x1", replace_infs(col("y"), lit(-99))).show()
## +----+--------+-----+
## | x| y| x1|
## +----+--------+-----+
## |null| null| null|
## | 1.0|Infinity|-99.0|
## |null| 2.0| 2.0|
## +----+--------+-----+