pyspark中的case语句问题

Posted

技术标签:

【中文标题】pyspark中的case语句问题【英文标题】:Issue in case statement in pyspark 【发布时间】:2020-05-13 11:11:39 【问题描述】:

我正在使用下面的代码来获取一个数据帧,但出现错误。如果将从代码中删除 case 语句,那么它将正常工作。

from pyspark.sql import functions as F
ivr_icm_cfs_lookup = spark.table("sample_table").where(F.col("tier") == "Servicing").select("fig","fig_bu","tier") .withColumn("fig",F.regexp_replace(F.col("fig"),"[^0-9a-zA-Z]",' ')).withColumn("fig_bu",F.when((F.col("fig_bu") == 'OPEN' & F.col("tier") == 'Academy', F.upper("tier")).otherwise(F.col("fig_bu"))))

【问题讨论】:

错误:文件“/opt/mapr/spark/spark-2.3.2/python/pyspark/sql/column.py”,第 116 行,在 _ njc = getattr(self._jc, name )(jc) 文件“/opt/mapr/spark/spark-2.3.2/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,第 1257 行,在 call 文件“/opt/mapr/spark/spark-2.3.2/python/pyspark/sql/utils.py”,第 63 行,deco return f(*a, **kw) py4j.protocol.Py4JError: An调用 o113.and 时发生错误。 Trace: py4j.Py4JException: Method and([class java.lang.String]) 不存在 【参考方案1】:

先生,您的括号有问题。立即尝试

from pyspark.sql import functions as F
ivr_icm_cfs_lookup = spark.table("sample_table").where(F.col("tier") == "Servicing").select("fig","fig_bu","tier") .withColumn("fig",F.regexp_replace(F.col("fig"),"[^0-9a-zA-Z]",' ')).withColumn("fig_bu",F.when((F.col("fig_bu") == 'OPEN') & (F.col("tier") == 'Academy'), F.upper("tier")).otherwise(F.col("fig_bu")))

如果这真的不适合你,那么你可以通过将数据框注册为表然后在 sql 中编写你的案例来尝试 spark sql。

from pyspark.sql import functions as F
ivr_icm_cfs_lookup = spark.table("sample_table").where(F.col("tier") == "Servicing").select("fig","fig_bu","tier") .withColumn("fig",F.regexp_replace(F.col("fig"),"[^0-9a-zA-Z]",' '))

ivr_icm_cfs_lookup.createOrReplaceTempView('ivr_icm_cfs_lookup_table')
ivr_icm_cfs_lookup_df = spark.sql('''
select *, case when fig_bu='OPEN' and tier='Academy' then upper(tier) else fig_bu END as fig_bu_2 from ivr_icm_cfs_lookup_table
'''

这样你就可以添加所需的列了。

【讨论】:

仍然出现错误:文件“/opt/mapr/spark/spark-2.3.2/python/pyspark/sql/functions.py”,第 42 行,在 _ jc = getattr(sc._jvm .functions, name)(col._jc if isinstance(col, Column) else col) 文件“/opt/mapr/spark/spark-2.3.2/python/lib/py4j-0.10.7-src.zip/py4j/ java_gateway.py”,第 1257 行,在 call 文件中“/opt/mapr/spark/spark-2.3.2/python/pyspark/sql/utils.py”,第 63 行,在 deco 中返回 f (*a, **kw) "/opt/mapr/spark/spark-2.3.2/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py" py4j.protocol.Py4JError: 一个错误调用 z:org.apache.spark.sql.functions.upper 时发生。追踪: 有人可以帮我解决上述问题吗? 请帮我解决这个问题? 确切的错误是什么,它在我的系统中运行良好? 附上上述错误。请提出其他方法。

以上是关于pyspark中的case语句问题的主要内容,如果未能解决你的问题,请参考以下文章

case语句用法 case语句怎么用

从另一个 Case 语句引用 Case 语句中的标识符

C语言中的Switch-case语句

delphi中的case of语句

Case 语句中的 select 语句

MYSQL中的Case语句,没有找到Case?