Возможно, перебрав строку только один раз, вы сделаете это более эффективным.
(Предполагая текущую и правильную структуру "pos"):
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
df = sc.parallelize([['sdbsajkdbngdfgdfgdfgdfgdgdfgdgdfgdgdgsfhhfghfghdfghdfasjdh'],\
['sdahasdbsdfgsdfhhsfghhkghmaeserewyuouip,mfhdfbdfgbdfgjdtsagasjda']]).toDF(['Col1'])
pos = [(1,2),(3,5),(7,10),(11,15),(20,21),(22,24),(24,26),(26,30),(35,38),(38,42),(42,43),(45,50)]
flat_pos = [x for y in pos for x in y]
def split_function(row):
return_list = []
start_copy = False
flat_pos_index = 0
temp_list = []
max_pos = flat_pos[-1]
i = 0
while i < len(row):
if i > max_pos:
break
elif i == flat_pos[flat_pos_index]:
if flat_pos_index % 2 == 0:
start_copy = True
else:
start_copy = False
return_list.append("".join(temp_list))
temp_list = []
flat_pos_index += 1
if start_copy:
temp_list.append(row[i])
if flat_pos_index + 1 < len(flat_pos) and flat_pos[flat_pos_index] == flat_pos[flat_pos_index + 1]:
flat_pos_index += 1
start_copy = False
return_list.append("".join(temp_list))
temp_list = []
else:
i += 1
return "|".join(return_list)
udf2 = udf(split_function ,StringType())
final_df = df.withColumn("Split",udf2('Col1'))
final_df.collect()
[Строка (Стлб1 = u'sdbsajkdbngdfgdfgdfgdfgdgdfgdgdfgdgdgsfhhfghfghdfghdfasjdh»,
Разделить = u'd | са | ДБН | dfgd | д | г | г | fgdg | D | F | г | ghdfg '),
Строка (Стлб1 = u'sdahasdbsdfgsdfhhsfghhkghmaeserewyuouip, mfhdfbdfgbdfgjdtsagasjda»,
Split = u'd | га | BSD | GSDF | ч | к | ч | aese | о | р | ч | bdfgb ')]