首页 > 解决方案 > 为什么我的 Dataframe 列表达式不起作用?

问题描述

给定一个 DataFrame df,当我这样做时

df.select(df['category_id']+1000), 我得到结果

>>> df.select(df['category_id']).limit(3).show()
+-----------+
|category_id|
+-----------+
|          1|
|          2|
|          3|
+-----------+

>>> df.select(df['category_id']+1000).limit(3).show()
+--------------------+
|(category_id + 1000)|
+--------------------+
|                1001|
|                1002|
|                1003|
+--------------------+

但是,当我这样做时df.select(df['category_name']+ ' blah'),得到null

>>> df.select(df['category_name']).limit(3).show()
+-------------------+
|      category_name|
+-------------------+
|           Football|
|             Soccer|
|Baseball & Softball|
+-------------------+

>>> df.select(df['category_name']+'blah').limit(3).show()
+----------------------+
|(category_name + blah)|
+----------------------+
|                  null|
|                  null|
|                  null|
+----------------------+

只是想知道是什么让一个工作而另一个不工作?我错过了什么?

标签: pyspark

解决方案


与 python 不同,+运算符在 spark 中没有定义为字符串连接(sql 也不这样做),而是concat/concat_ws用于字符串连接。

import pyspark.sql.functions as f

df.select(f.concat(df.category_name, f.lit('blah')).alias('category_name')).show(truncate=False)
#+-----------------------+
#|category_name          |
#+-----------------------+
#|Footballblah           |
#|Soccerblah             |
#|Baseball & Softballblah|
#+-----------------------+

df.select(f.concat_ws(' ', df.category_name, f.lit('blah')).alias('category_name')).show(truncate=False)
#+------------------------+
#|category_name           |
#+------------------------+
#|Football blah           |
#|Soccer blah             |
#|Baseball & Softball blah|
#+------------------------+

推荐阅读