Вопрос или проблема
У меня есть строка, содержащаяся в столбце pyspark dataframe с именем text (один столбец).
30,kUsUO,6,18,97,42,”SAM,K,KARAN”,lmhYK,49,aLaTA,51,34,3,49,75,39,pdwvW,54,7,63,12,25,26,SJ12u,rUFUV,34,xXBv3,XHtz4,r4Fyh,14,20,0jZL2,izrsC,44,K5Kw3,8,tcKu7,5,RPLcy,kg4IR,Kvs3p,lyG09,dJmZB,34,84,7,qED2y,8uNen,5,96,81,88,bGgqK,FAsIV,81,YXZ,PQR,”Flat No B1002, Balaji Whitefield society, sus road, pune,Mh”,22,591213,LbAo7,21,18,text,,,,,
Мне нужно подсчитать количество запятых в этом столбце (text), но исключить запятые, которые находятся в двойных кавычках.
Так что регулярное выражение должно исключать запятые, находящиеся в следующих двойных кавычках:
“SAM,K,KARAN”
“Flat No B1002, Balaji Whitefield society, sus road, pune,Mh”
Таким образом, правильное количество здесь 68 (исключая запятые, находящиеся в двойных кавычках).
Чтобы достичь этого, я использовал следующий код, но это выражение занимает много времени. Поскольку у меня есть 100 миллионов записей в этом dataframe, я ищу лучший подход.
# Регулярное выражение для подсчета запятых, не находящихся в двойных кавычках
df = df.withColumn(
"CommaCount",
F.size(F.split(F.col("SingleColumn"), r',(?=(?:[^"]*"[^"]*")*[^"]*$)')) - 1
)
Любая помощь приветствуется.
Вы можете подсчитать общее количество запятых и вычесть те, которые находятся в двойных кавычках:
import re
str="30,kUsUO,6,18,97,42,"SAM,K,KARAN",lmhYK,49,aLaTA,51,34,3,49,75,39,pdwvW,54,7,63,12,25,26,SJ12u,rUFUV,34,xXBv3,XHtz4,r4Fyh,14,20,0jZL2,izrsC,44,K5Kw3,8,tcKu7,5,RPLcy,kg4IR,Kvs3p,lyG09,dJmZB,34,84,7,qED2y,8uNen,5,96,81,88,bGgqK,FAsIV,81,YXZ,PQR,"Flat No B1002, Balaji Whitefield society, sus road, pune,Mh",22,591213,LbAo7,21,18,text,,,,,"
print(str.count(',') - sum(s.count(',') for s in re.findall('"([^"]*)"', str)))
Результат:
68
Ответ или решение
Для решения задачи подсчета количества запятых в строках столбца DataFrame PySpark, исключая запятые, находящиеся в двойных кавычках, можно использовать более эффективный подход, чтобы избежать долгих вычислений на больших объемах данных (например, 100 миллионов записей).
В данном случае, можно воспользоваться функциональными возможностями PySpark без сложных регулярных выражений. Рассмотрим следующий код, который выполняет необходимые вычисления:
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
# Инициализация SparkSession
spark = SparkSession.builder \
.appName("Count Commas Excluding Quotes") \
.getOrCreate()
# Примерные данные
data = [("30,kUsUO,6,18,97,42,\"SAM,K,KARAN\",lmhYK,49,aLaTA,51,34,3,49,75,39,pdwvW,54,7,63,12,25,26,SJ12u,rUFUV,34,xXBv3,XHtz4,r4Fyh,14,20,0jZL2,izrsC,44,K5Kw3,8,tcKu7,5,RPLcy,kg4IR,Kvs3p,lyG09,dJmZB,34,84,7,qED2y,8uNen,5,96,81,88,bGgqK,FAsIV,81,YXZ,PQR,\"Flat No B1002, Balaji Whitefield society, sus road, pune,Mh\",22,591213,LbAo7,21,18,text,,,,," ,)]
df = spark.createDataFrame(data, ["text"])
# Функция для подсчета запятых, не учитывая запятые внутри кавычек
def count_commas(text):
# Сначала нужно подсчитать общее число запятых
total_commas = text.count(',')
# Затем считаем запятые внутри кавычек, используя регулярное выражение
quoted_commas = sum(s.count(',') for s in re.findall(r'"([^"]*)"', text))
# Возвращаем разность между общим числом запятых и запятыми внутри кавычек
return total_commas - quoted_commas
# Создаем UDF для использования в DataFrame
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType
count_commas_udf = udf(count_commas, IntegerType())
# Применяем UDF к столбцу с текстом
df_with_commas = df.withColumn("CommaCount", count_commas_udf(F.col("text")))
# Вывод результата
df_with_commas.show(truncate=False)
Объяснение кода:
-
Импорт библиотек: Мы импортируем необходимые библиотеки
pyspark
иre
. -
Инициализация Spark: Создание
SparkSession
, необходимого для работы с DataFrame. -
Создание DataFrame: Пример данных помещается в DataFrame с одним столбцом
text
. -
Функция
count_commas
: Эта функция принимает строку, подсчитывает общее количество запятых в строке и количество запятых, находящихся в двойных кавычках, затем возвращает разницу. -
Создание UDF: Мы создаем пользовательскую функцию (UDF), чтобы применять нашу функцию подсчета запятых к каждому элементу столбца в DataFrame.
-
Применение UDF: Мы добавляем новый столбец
CommaCount
в DataFrame, в котором хранится количество запятых, исключая запятые внутри кавычек. -
Вывод результата: В конце выводим DataFrame с подсчитанным количеством запятых.
Этот подход должен быть более производительным, чем использование сложных регулярных выражений, особенно на больших наборах данных.