从 pyspark 中的数据帧列中删除最后一个管道分隔值

2024-04-05

我正在使用 Spark 2.1 并且有一个数据框列包含类似的值AB|12|XY|4。 我想通过删除最后一个元素来创建一个新列,所以它应该显示为AB|12|XY.

我尝试拆分,rsplit 不起作用,因此需要一些建议才能获得所需的输出。


使用 Spark SQLsplit功能 https://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.functions.split如下:

>>> from pyspark.sql.functions import split
>>> json_data = ['{"c1":"AB|12|XY|4"}','{"c1":"11|22|33|44|remove"}']
>>> df        = spark.read.json(sc.parallelize(json_data))
>>> df.show()
+------------------+                   
|                c1|                  
+------------------+                  
|        AB|12|XY|4|                  
|11|22|33|44|remove|                  
+------------------+                  

>>> df2 = df.withColumn("c2", split(df.c1, '\|\w+$')[0])  # split takes a regex pattern
>>> df2.show()
+------------------+-----------+
|                c1|         c2|
+------------------+-----------+
|        AB|12|XY|4|   AB|12|XY|
|11|22|33|44|remove|11|22|33|44|
+------------------+-----------+ 

如果您需要做一些无法使用内置函数实现的更复杂的事情,您可以定义自己的用户定义函数(UDF):

>>> from pyspark.sql.functions import udf
>>> from pyspark.sql.types import *
>>> def my_func(str):
...   return str.rsplit('|',1)[0]
...
>>> my_udf    = udf(my_func, StringType())
>>> json_data = ['{"c1":"AB|12|XY|4"}','{"c1":"11|22|33|44|remove"}']
>>> df        = spark.read.json(sc.parallelize(json_data))

>>> df2 = df.withColumn("c2", my_udf(df.c1))
>>> df2.show()
+------------------+-----------+ 
|                c1|         c2|
+------------------+-----------+
|        AB|12|XY|4|   AB|12|XY|
|11|22|33|44|remove|11|22|33|44|
+------------------+-----------+

内置SQL函数优先 http://www.cs.sfu.ca/CourseCentral/732/ggbaker/content/spark-sql.html#udf (also here http://www.cs.sfu.ca/CourseCentral/732/ggbaker/content/spark-sql.html#python-jvm)因为您的数据不会在 JVM 进程和 Python 进程之间来回传递,而这正是使用 UDF 时发生的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 pyspark 中的数据帧列中删除最后一个管道分隔值 的相关文章

随机推荐