Vis*_*ath 1 split dataframe apache-spark pyspark
我正在使用 spark 2.1 并且有一个数据框列包含像AB|12|XY|4. 我想通过删除最后一个元素来创建一个新列,因此它应该显示为AB|12|XY.
我试图拆分,rsplit 不起作用,所以需要一些建议来获得所需的输出。
使用 Spark SQLsplit函数如下:
>>> 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|
+------------------+-----------+
Run Code Online (Sandbox Code Playgroud)
如果您需要做一些无法使用内置函数实现的更复杂的事情,您可以定义自己的用户定义函数 (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|
+------------------+-----------+
Run Code Online (Sandbox Code Playgroud)
内置SQL 函数是首选(也在此处),因为您的数据不会在 JVM 进程和 Python 进程之间来回传递,而这正是使用 UDF 时发生的情况。
| 归档时间: |
|
| 查看次数: |
1110 次 |
| 最近记录: |