【问题标题】:Remove rows where value is string in pyspark dataframe删除pyspark数据框中值为字符串的行
【发布时间】:2019-11-14 03:47:42
【问题描述】:

我正在尝试对使用 Apache Spark 存储在 MongoDB 数据库中的地理空间数据使用 KMeans。数据格式如下,

DataFrame[decimalLatitude: double, decimalLongitude: double, features: vector]

代码如下,其中inputdf为dataframe。

vecAssembler = VectorAssembler(
                inputCols=["decimalLatitude", "decimalLongitude"],
                outputCol="features")
inputdf = vecAssembler.transform(inputdf)
kmeans = KMeans(k = 10, seed = 123)
model = kmeans.fit(inputdf.select("features"))

数据集中似乎有一些空字符串,因为我收到以下错误,

com.mongodb.spark.exceptions.MongoTypeConversionException: Cannot cast STRING into a IntegerType (value: BsonString{value=''})

我试图找到这样的行,

issuedf = inputdf.where(inputdf.decimalLatitude == '')
issuedf.show()

但我得到与上面相同的类型转换错误。我也试过df.replace,但我得到了同样的错误。如何删除存在此类值的所有行?

【问题讨论】:

  • 请在您的问题中包含导致错误的代码。
  • @cronoik,我进行了编辑。错误一定是因为features 属性中的字符串。但是,由于它是由decimalLatitudedecimalLongitude 创建的,我相信问题一定出在其中一个或两个上。该代码也适用于同一父数据集的不同子集。
  • 你有一个数据框,它的模式可能是 [int, int] 但有些行有字符串值。我相信您必须在创建数据框之前过滤字符串值(即使将它们转换为 None 也可以),否则您将无法使用该数据框。在这里查看接受的answer

标签: python apache-spark pyspark pyspark-dataframes


【解决方案1】:

这个问题可以通过在加载数据时提供数据类型来解决,如下所示,

inputdf = my_spark.read.format("mongo").load(schema=StructType(
    [StructField("decimalLatitude", DoubleType(), True),
     StructField("decimalLongitude", DoubleType(), True)]))

这确保所有值都是DoubleType。现在可以使用inputdf.dropna()删除空值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多