Как создать новые столбцы в фрейме данных, используя Spark Scala на основе разных строковых паттернов - PullRequest
0 голосов
/ 20 марта 2019

Шаг 1. Я создал Dataframe df с двумя столбцами «COLUMN A» и «COLUMN B» типа string.

Шаг 2: Я создал новые столбцы из «КОЛОНКА B» на основе их позиций в индексе.

Мое требование: мне нужно создать еще один столбец a6 НЕ в позиции индекса, а с помощью чего-либо, совпадающего с yyy или xxx, yyy или zzz в строке

val extractedDF = df
      .withColumn("a1", regexp_extract($"_raw", "\\[(.*?)\\] \\[(.*?)\\]",2))
      .withColumn("a2", regexp_extract($"_raw", "\\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\]",3))
      .withColumn("a3", regexp_extract($"_raw", "\\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\]",5))
      .withColumn("a4", regexp_extract($"_raw", "(?<=uvwx: )(.*?)(?=,)",1))
      .withColumn("a5", regexp_extract($"_raw", "\\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\] \\[(.*?)\\]",13))

Пожалуйста, помогите мне !!

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Вы можете использовать regexp_replace () и предоставить xxx | yyy | zzz в качестве чередования

scala> val df = Seq(("abcdef"),("axxx"),("byyypp"),("czzzr")).toDF("_raw")
df: org.apache.spark.sql.DataFrame = [_raw: string]

scala> df.show(false)
+------+
|_raw  |
+------+
|abcdef|
|axxx  |
|byyypp|
|czzzr |
+------+


scala>  df.withColumn("a6",regexp_replace($"_raw",""".*(xxx|yyy|zzz).*""","OK")===lit("OK")).show(false)
+------+-----+
|_raw  |a6   |
+------+-----+
|abcdef|false|
|axxx  |true |
|byyypp|true |
|czzzr |true |
+------+-----+


scala>

Если вы хотите извлечь совпадение, тогда

scala> df.withColumn("a6",regexp_extract($"_raw",""".*(xxx|yyy|zzz).*""",1)).show(false)
+------+---+
|_raw  |a6 |
+------+---+
|abcdef|   |
|axxx  |xxx|
|byyypp|yyy|
|czzzr |zzz|
+------+---+


scala>

EDIT1:

scala> val df = Seq((""" [2019-03-18T02:13:20.988-05:00] [svc4_prod2_bpel_ms14] [NOTIFICATION] [] [oracle.soa.mediator.serviceEngine] [tid: [ACTIVE].ExecuteThread: '57' for queue: 'weblogic.kernel.Default (self-tuning)'] [userId: <anonymous>] [ecid: 7e05e8d3-8d20-475f-a414-cb3295151c3e-0054c6b8,1:84559] [APP: soa-infra] [partition-name: DOMAIN] [tenant-name: GLOBAL] [oracle.soa.tracking.FlowId: 14436421] [oracle.soa.tracking.InstanceId: 363460793] [oracle.soa.tracking.SCAEntityId: 50139] [composite_name: DFOLOutputRouting] """)).toDF("_raw")
df: org.apache.spark.sql.DataFrame = [_raw: string]

scala> df.withColumn("a6",regexp_extract($"_raw",""".*(composite_name|compositename|composites|componentDN):\s+(\S+)\]""",2)).select("a6").show(false)
+-----------------+
|a6               |
+-----------------+
|DFOLOutputRouting|
+-----------------+


scala>

EDIT2

scala> val df = Seq((""" [2019-03-18T02:13:20.988-05:00] [svc4_prod2_bpel_ms14] [NOTIFICATION] [] [oracle.soa.mediator.serviceEngine] [tid: [ACTIVE].ExecuteThread: '57' for queue: 'weblogic.kernel.Default (self-tuning)'] [userId: <anonymous>] [ecid: 7e05e8d3-8d20-475f-a414-cb3295151c3e-0054c6b8,1:84559] [APP: soa-infra] [partition-name: DOMAIN] [tenant-name: GLOBAL] [oracle.soa.tracking.FlowId: 14436421] [oracle.soa.tracking.InstanceId: 363460793] [oracle.soa.tracking.SCAEntityId: 50139] [composite_name: DFOLOutputRouting!3.20.0202.190103.1116_19] """)).toDF("_raw")
df: org.apache.spark.sql.DataFrame = [_raw: string]

scala> df.withColumn("a6",regexp_extract($"_raw",""".*(composite_name|compositename|composites|componentDN):\s+([a-zA-Z]+)""",2)).select("a6").show(false)
+-----------------+
|a6               |
+-----------------+
|DFOLOutputRouting|
+-----------------+


scala>
0 голосов
/ 20 марта 2019

Полагаю, вы только собираетесь получить результат, который соответствует приведенной выше строке,

, вы можете использовать следующий код:

df.withColumn ("a6", col ("colName"). содержит ("гггг") || col ("colName"). содержит ("ххх"))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...