如何在PySpark 1.6中将DataFrame列从字符串转换为浮点数/双精度?

10
在PySpark 1.6 DataFrame中,目前没有内置的Spark函数可以将字符串转换为浮点数/双精度浮点数。
假设我们有一个包含(“房屋名称”,“价格”)的RDD,两个值都是字符串。您想将价格从字符串转换为浮点数。 在PySpark中,我们可以应用map和python float函数来实现这一点。
New_RDD = RawDataRDD.map(lambda (house_name, price): (house_name, float(x.price))    # this works

在 PySpark 1.6 的数据框中,它无法正常工作:
New_DF = rawdataDF.select('house name', float('price')) # did not work

在没有内置的Pyspark函数的情况下,如何使用UDF实现此转换?我编写了以下转换UDF:

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

def string_to_float(x):
    return float(x)

udfstring_to_float = udf(string_to_float, StringType())
rawdata.withColumn("house name", udfstring_to_float("price"))

有没有更好、更简单的方法来实现相同的功能呢?
2个回答

9
根据文档,您可以像这样在列上使用cast函数:
rawdata.withColumn("house name", rawdata["price"].cast(DoubleType()).alias("price"))

1
这对我不起作用,@Jaco。OP说他正在使用pyspark 1.6,而您链接的文档是1.3。当我在1.6上尝试时,我得到了“AttributeError:'DoubleType'对象没有'alias'属性”的错误。 - makansij
你有导入 from pyspark.sql.types import DoubleType 吗?我确定在发布之前已经在 PySpark 1.6 上测试过了。 - Alex
4
修正为: rawdata.withColumn("house name", rawdata["price"].cast(DoubleType()).alias("price")) - AntiPawn79

2
答案应该如下所示:
>>> rawdata.printSchema()
root
 |-- house name: string (nullable = true)
 |-- price: string (nullable = true)

>>> rawdata=rawdata.withColumn('price',rawdata['price'].cast("float").alias('price'))

>>> rawdata.printSchema()
root
 |-- house name: string (nullable = true)
 |-- price: float (nullable = true)

这是最短的一行代码,没有使用任何自定义函数。您可以通过使用printSchema()函数来检查它是否正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接