вы можете использовать комбинацию regexp_replace и разделить API функционального модуля
import pyspark.sql.types as t
import pyspark.sql.functions as f
l1 = [('anystring',),('a1234bc123',),('av1tb12h18',)]
df = spark.createDataFrame(l1).toDF('col')
df.show()
+----------+
| col|
+----------+
| anystring|
|a1234bc123|
|av1tb12h18|
+----------+
Теперь используйте замену соответствующего регулярного выражения, а затем разделите его на «,». Здесь $1 относится к замененному значению, поэтому оно будет пустым для сопоставления с регулярным выражением.
e.g replace('anystring')
$0 = anystring
$1 = ""
dfl1 = df.withColumn('temp', f.split(f.regexp_replace("col", "[a-z]*([0-9]*)", "$1,"), ","))
dfl1.show()
+----------+---------------+
| col| temp|
+----------+---------------+
| anystring| [, , ]|
|a1234bc123|[1234, 123, , ]|
|av1tb12h18|[1, 12, 18, , ]|
+----------+---------------+
Искра ‹2.4
Используйте UDF для замены пустых значений массива
def func_drop_from_array(arr):
return [x for x in arr if x != '']
drop_from_array = f.udf(func_drop_from_array, t.ArrayType(t.StringType()))
dfl1.withColumn('final', drop_from_array('temp')).show()
+----------+---------------+-----------+
| col| temp| final|
+----------+---------------+-----------+
| anystring| [, , ]| []|
|a1234bc123|[1234, 123, , ]|[1234, 123]|
|av1tb12h18|[1, 12, 18, , ]|[1, 12, 18]|
+----------+---------------+-----------+
Искра >=2,4
Используйте array_remove
dfl1.withColumn('final', f.array_remove('temp','')).show()
+----------+---------------+-----------+
| col| temp| final|
+----------+---------------+-----------+
| anystring| [, , ]| []|
|a1234bc123|[1234, 123, , ]|[1234, 123]|
|av1tb12h18|[1, 12, 18, , ]|[1, 12, 18]|
+----------+---------------+-----------+
person
SMaZ
schedule
26.08.2019