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|
## +----+--------+-----+