Подход к очистке данных в искре - PullRequest
0 голосов
/ 01 ноября 2019

Я совершенно новый студент в области инженерии данных / машинного обучения и самостоятельного обучения. Работая над примером проблемы, я столкнулся со следующей задачей очистки данных

1. Remove extra whitespaces (keep one whitespace in between word but remove more 
than one whitespaces) and punctuations

2. Turn all the words to lower case and remove stop words (list from NLTK)

3. Remove duplicate words in ASSEMBLY_NAME column

Хотя я работал над написанием кода для выполнения этой задачи во время заданий в колледже, я никогда не делал это водин кусок кода (для любого проекта), и я жду рекомендаций от экспертов, которые могут помочь мне, указав на лучший подход для его выполнения (in python or scala)

Работа, проделанная до сих пор:

1. Считать данные из файла партера

partFitmentDF = sqlContext.read.parquet("/mnt/blob/devdatasciencesto/pga-parts-forecast/raw/parts-fits/")

display(partFitmentDF)

enter image description here 2. Создать таблицу из DF

partFitmentDF.createOrReplaceTempView("partsFits")
partFitmentDF.write.mode("overwrite").format("delta").saveAsTable("partsFitsTable")

3. Перегруппируйте данные fits_assembly_name в таблице таким образом, чтобы все fits_assembly_name и fits_assembly_id переносились в одну строку для каждого отдельного элемента no *

%sql

select itemno, concat_ws(' | ' , collect_set(cast(fits_assembly_id as int))) as fits_assembly_id, concat_ws(' | ' ,collect_set(fits_assembly_name)) as fits_assembly_name 
from partsFitsTable 
WHERE itemno = 1014584
group by itemno

enter image description here

PS

Пример данных из выбранных столбцов partFitmentDF

itemno  fits_assembly_id        fits_assembly_name
0450056 44011           OIL PUMP ASSEMBLY - A01EA09CA (4999202399920239A06)
0450056 135502          OIL PUMP ASSEMBLY - A02EA09CA/CB/CC (4999202399920239A06)
0450056 37884           OIL PUMP ASSEMBLY - A01EA05CA (4999202399920239A06)
0450056 19618           OIL PUMP ASSEMBLY - A06FA09CA/CB/CC (4999202399920239A06)
0450056 135021          OIL PUMP ASSEMBLY - A02EA05CA (4999202399920239A06)
0450056 4147            OIL PUMP ASSEMBLY - A04KA05CA (4999202359920235A06)
0450056 12003           OIL PUMP ASSEMBLY - A05FA09CA/CB/CC (4999202399920239A06)

Теперь мне нужно свернуть эти несколько строк в однустрока за номером позиции (все имя_сборки и идентификаторы, принадлежащие одному номеру элемента, должны находиться в одной строке) , а затем мне нужно выполнить задачи 1, 2 и 3, перечисленные в самом верху, чтобы очистить столбец fits_assembly_nameи сохраните обработанные данные в окончательный фрейм данных или таблицу с столбцами itemno, fits_assembly_id и fits_assembly_name , но я не уверен, как начать работу в python, чтобы это сделать. Не могли бы вы помочь мне, предложив подход (и подсказку кода) , чтобы я мог продолжить эту задачу?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Проверьте, работает ли следующее для вас. Я предположил, что df - это фрейм данных после группового набора и набора_коллекторов, которые вы уже выполняли:

from pyspark.ml.feature import StopWordsRemover, RegexTokenizer
from pyspark.sql.functions import expr

Задача-1: Использовать RegexTokenizer

использовать шаблон (?:\p{Punct}|\s)+чтобы разбить строку, сохраните результат в столбец temp1. Полученный массив строк будет содержать все элементы в нижнем регистре, пробелы в начале и в конце также удаляются.

tk = RegexTokenizer(pattern=r'(?:\p{Punct}|\s)+', inputCol='fits_assembly_name', outputCol='temp1')

df1 = tk.transform(df)

Задача-2: Используйте StopWordsRemover

для удаления стоп-слови сохраните результат в столбце temp2:

sw = StopWordsRemover(inputCol='temp1', outputCol='temp2')

df2 = sw.transform(df1)

. Вы можете проверить все текущие стоп-слова, набрав sw.getStopWords(), отметив loadDefaultStopWords (language) , чтобы переключиться на другую настройку языка, илидобавьте свои собственные стоп-слова следующим образом:

mylist = sw.getStopWords() + ['my', 'black', 'list']
# then adjust the transformer to the following
sw = StopWordsRemover(inputCol='temp1', outputCol='temp2', stopWords=mylist)

На этом этапе у вас должен быть столбец с массивом строк temp2 с удаленными стоп-словами.

Task-3:

используйте array_distinct () для удаления дубликатов, concat_ws () для преобразования массива в строку, а затем отбросьте два временных столбца:

df_new = df2.withColumn('fits_assembly_name', expr('concat_ws(" ", array_distinct(temp2))')) \
            .drop('temp1', 'temp2')

Дайте мне знать, если у вас возникли проблемыс вышеуказанным кодом.

0 голосов
/ 01 ноября 2019

Вы хотите использовать функции SQL или pyspark.

  • Документы pyspark
  • Документы Spark SQL

  • trim(s) - возвращает строку s с начальным и конечным пробелом

  • regexp_replace(s, "\W") - возвращает строку s с небуквенно-цифровые символы («пунктуация») заменяются пробелами
  • lower(s) - возвращает строку s со всеми символами в нижнем регистре
  • split(s) - возвращает массив словв строке s split, где границы слов представляют собой один или несколько пробелов.
  • array_distinct(a) - возвращает отдельные элементы

. Сложите все это вместе в pyspark:

from pyspark.sql import *
import pyspark.sql.functions as F

df = spark.createDataFrame( [Row(name="BODY, DECALS - Z19VF99LK/LE (702498)"), Row(name="     ABC  DEF ABC   ")] ) 
clean_df = df.withColumn("words", 
                         F.array_distinct(
                             F.split(
                               F.trim(
                                 F.regexp_replace(F.lower(df.name), "\W", " ")
                               )
                             , " +")
                         )
                        )
clean_df.show(truncate=False)

Чтобы получить столбец words с результатом:

+------------------------------------+-------------------------------------+
|name                                |words                                |
+------------------------------------+-------------------------------------+
|BODY, DECALS - Z19VF99LK/LE (702498)|[body, decals, z19vf99lk, le, 702498]|
|     ABC  DEF ABC                   |[abc, def]                           |
+------------------------------------+-------------------------------------+

Я немного не уверен в точной проблеме, но это должно заставить вас двигаться в правильном направлении.

...