【问题标题】:Pyspark 2.7 Set StringType columns in a dataframe to 'null' when value is ""Pyspark 2.7 当值为“”时,将数据框中的 StringType 列设置为“null”
【发布时间】:2022-01-26 03:55:10
【问题描述】:

我有一个名为 good_df 的 DataFrame,它具有混合类型的列。我正在尝试为StringType 的列将任何空值设置为'null'。我认为下面的代码会起作用,但事实并非如此。

self.good_df = self.good_df.select([when((col(c)=='') & (isinstance(self.good_df.schema[c].dataType, StringType)),'null').otherwise(col(c)).alias(c) for c in self.good_df.columns])

我正在查看错误消息,但它并没有给我太多线索:

Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件 “/usr/lib/python2.7/site-packages/pyspark/sql/column.py”,第 116 行,在 _ njc = getattr(self._jc, name)(jc) 文件“/usr/lib/python2.7/site-packages/py4j/java_gateway.py”,第 1257 行,在 call answer, self.gateway_client, self.target_id, self.name) 文件“/usr/lib/python2.7/site-packages/pyspark/sql/utils.py”,第 63 行,在 deco 返回 f(*a, **kw) 文件 “/usr/lib/python2.7/site-packages/py4j/protocol.py”,第 332 行,在 get_return_value 格式(target_id, ".", name, value)) Py4JError: An 调用 o792.and 时发生错误。跟踪:py4j.Py4JException: 方法 and([class java.lang.Boolean]) 不存在于 py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318) 在 py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326) 在 py4j.Gateway.invoke(Gateway.java:274) 在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands.CallCommand.execute(CallCommand.java:79) 在 py4j.GatewayConnection.run(GatewayConnection.java:238) 在 java.lang.Thread.run(Thread.java:748)

有人对正在发生的事情有任何想法吗? 谢谢!

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    你得到的错误信息:

    py4j.Py4JException: Method and([class java.lang.Boolean]) 没有 存在

    这意味着您尝试在 Column 表达式和文字 Boolean 值之间应用 AND 运算符。

    你需要改变这部分:

    (isinstance(self.good_df.schema[c].dataType, StringType))
    

    from pyspark.sql.functions import lit
    
    lit(isinstance(self.good_df.schema[c].dataType, StringType))
    

    也就是说,实际上你可以将检查列类型的条件直接移动到python list-comprehension中:

    self.good_df = self.good_df.select(*[
        when((col(c) == ''), 'null').otherwise(col(c)).alias(c) if t == "string" else col(c)
        for c, t in self.good_df.dtypes
    ])
    

    【讨论】:

    • 非常非常感谢!最后一个 sn-p 就像一个魅力。你太棒了!
    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多